Android 笔记

2019-08-11  本文已影响0人  小强开学前

1. RecyclerView

2. AppbarLayout

AppBarLayout的style定义在Widget.Design.AppBarLayout

再进一步可以找到elevation的高度是design_appbar_elevatio

因此只要在自己项目的dimens中重写这个值即可
<resources xmlns:tools="http://schemas.android.com/tools">
   <dimen name="design_appbar_elevation" tools:override="true">0dp</dimen>
</resources>

3. 自定义 view

一开始因为定义太多,搞不清楚,妈的

大致流程是这样的:

其实分类可以分为两类:

  1. 自定义 view(这里是狭义的,标题自定义 view 是广义的,理解为自定义控件)
  2. 自定义 viewGroup

另外根据自定义方式可以分为三大类:

  1. 在 Android 原有的 view 上添加一些功能
    例如:我希望我的所有 TextView 都是红色字,那就直接定义一个类,继承自 Appcompat 下的 TextView(为了兼容性),然后在构造函数里面直接调用setTextColor(Int int)函数就行了。
  2. 自己写 layout 布局
    比如:我想自定义搜索框,然后在很多页面都可以复用,直接当做一个使用使用,那我定义一个类,继承自我这个搜索框布局的最外层对应的 viewGroup 类(LinearLayout、ConstraintLayout...),然后在构造函数中LayoutInflater这个 xml 文件,然后完事。
  3. 纯手画
    Canvas、Paint、TextPaint,画画需要画布、画笔、可以写字的笔,这个最好玩,但是又要学新知识,一堆概念,还在努力中。

4. 自定义 view 的坑

 recycler_view_fgd.outlineProvider = object : ViewOutlineProvider() {
            override fun getOutline(view: View, outline: Outline) {
                outline.setRoundRect(0, 0, view.width / titles.size, view.height, layoutRadius)
            }
        }

直接调用view.width即可。
或者呢如果是监听事件需要,设置全部变量,然后在 onMeasure() 里面初始化。

5. 监听输入法回车键

6. 屏幕适配

由于 API 26 及以上的 Activity#getResources()#getDisplayMetrics() 和 Application#getResources()#getDisplayMetrics() 是不同的引用,所以在 API 26 及以上适配是没有影响的,但在 API 26 以下 Activity#getResources()#getDisplayMetrics() 和Application#getResources()#getDisplayMetrics() 是相同的引用,导致适配有问题。

7. kotlin 监听输入框文字,只要有字就显示“X”图标

一开始我是这么写的,错了

              override fun onTextChanged(p0: CharSequence?, p1: Int, p2: Int, p3: Int) {
              if (p0.toString().trim().isNotEmpty())
                  clear_search.visibility = View.VISIBLE
              else
                  clear_search.visibility = View.INVISIBLE
          }

发现输入空格也会出现,是因为kotlin默认允许null值toString(),并且返回“null”
解决方法:前面加个判断或者使用RxBinding,见下文。

8. 舒服的RxBinding(感谢LeiHolmes

9. Android Studio 取消方法的参数间自动换行,使看起来更一致

Preference -> Editor-> Code Style -> kotlin -> Wrapping and braces -> Keep when reformatting
取消勾选 Line breaks,会看见右边模拟代码出会有这次修改产生的效果。
Keep when reformatting同一级的、在其上方可以看见 Hard wrap at,意思是一行达到这个字数就强制换行,可以修改成想要的字数,默认是default<==>100。

9. Glide 加载大图到Recyclerview的几种方式比较,ImageView宽度全屏,高度自适应

10. Android端接入支付宝问题

* 横竖屏切换的生命周期
```
  WelcomeActivity:onCreate
  WelcomeActivity:onStart
  WelcomeActivity:onResume
  WelcomeActivity:onPause
  WelcomeActivity:onResume
  WelcomeActivity:onConfigurationChanged
  WelcomeActivity:onPause
```

11. Retrofit之坑

没有一个好用的框架,适合自己的只有自己写的,干。

首先使用的时候按照大家喜闻乐见的方式调用,取消的话就直接call.cancel(),但偶然发现tmd这个所谓动态代理模式完成的Retrofit为了解耦,cancel()是不能及时让回调知道的。

上面说的简直不是人话,行业陋习,能简单解释清楚的非要整一堆术语。

其实就是callback里的回调方法在判断call!!.isCanceled()的时候不及时,cancel了还是返回false,也就是没有被取消。

心路历程

首先是测试在aActivity发请求,这时候由于某种问题直接跳转到bActivity然后finish aActivity,并且a的onDestory调用了call?.cancel(),但callback的回调会依然执行,并且,在已经与服务器建立连接的情况下会默认调用onFailure(),那假如我在失败的回调中有UI处理,或者只是简单的非Application级别的Toast,APP直接FC
⬇️
然后我分别在回调中判断call!!.isCanceled()发现还是不行,一直返回false
⬇️
然后看见

jianshu.png
ok,在onFailure()的回调中加上判断,继续,还是不行,调试发现message为socketClosed
⬇️
继续研究发现,没建立连接消息为canceled,建立后canceled直接会socketClosed,那我要判断socketClosed作为取消的条件吗?不对
分析需要的状态(比如下载文件):

但是别忘了,没有网络或者网络错误也是会有socketClosed消息并且走onFailure()

瞬间想骂娘。

然后看见有自定义CallBack的,自定义Call的,想了想,还tm不如不用了。

但是权衡之后感觉,配合rx应该还行,所以还是没得出一个比较好的结论。

12. Fragment的生命周期

无论是怎么创建的,都是onCreateView -> onViewCreated -> onActivityCreated 这个顺序。

13. Window一些属性

Window布局:Window>DecorView>ContentView

属性名称 作用
windowIsFloating 自定义dialog中match_parent属性无效,因为默认此属性为true,会直接设置window的宽高为wrap_content
windowFrame 带不带默认dialog的边框

14. 自定义View获取不到所有属性

原因是context.obtainStyledAttributes(attrs,R.styleable.xxx)这里的attrs没写。

15. 自定义View使用TypedArray获取Drawable数组或者其他数组

以获取drawable数组为例

// 获取对应的资源id,类似R.array.xxx
val resIcon = ta.getResourceId(R.styleable.MuseTabBar_tab_bar_icons, -1)
// 通过id获取资源,类似resource.getIntArray()
val iconTa = resources.obtainTypedArray(resIcon)
// 本地建立数组
val icons = IntArray(iconTa.length())
// 遍历资源
for (i in 0 until iconTa.length()) {
    // 获取资源中的每个drawable id
    icons[i] = iconTa.getResourceId(i, 0)
}
上一篇 下一篇

猜你喜欢

热点阅读