相比JakeWharton 大神的Butter Knife,Google Android出品的ViewBinding更加省事。
1,在build.gradle文件中的android配置中添加
buildFeatures { viewBinding true }
2,而后你只需要创建布局文件
3,在对应的Activity或fragment中拿到对应的ViewBinding对象就能拿到,xml文件中的所有有id的控件
看懂你在对应文件中需要拿哪个对象了吧。如果是fragment_blank.xml,就要在该Activity中拿到FragmentBlankBinding对象来获得控件就行,即布局文件名驼峰大写,去掉下划线,最后加个Binding,这个名称的文件是系统自动帮你生成的。(该文件在build/generated/data_binding_base_class_source_out/xxx…目录下)
ps:kotlin Java均可使用ViewBinding,但是kotlin还可以使用直接引用布局,直接用控件的id来调用控件的方法(注意控件ID最好唯一)
pps:目前Android推荐更不一样的的方式,使用Jetpack Compose都不用写xml了。
ppps:小伙们应该都能看到 Kotlin 1.4.20
的升级通知,在 Kotlin 1.4.20
中做了一个重要的更新 如下图所示:
简单总结一下,主要有以下几点:
- 废弃了
kotlin-android-extensions
编译插件 Parcelable
相关的功能,移到了新的插件kotlin-parcelize
按照 Google 的解释,
kotlin-android-extensions
插件只会保留至少一年的时间,将会在 2021 年 9 月或之后的 Kotlin 版本中将被移除
kotlin-android-extensions
主要有以下两个功能:
- 使用 Kotlin 合成方法(Synthetic 视图)取代
findViewById
,通过引入kotlinx.android.synthetic
可以直接使用控件的 ID,我猜当初也是因为这个特性,吸引了很多开发者开始学习和尝试使用 Kotlin - 手动实现
Parcelize
比较麻烦,所以 Kotlin 提供了@Parcelize
注解帮助快速实现 Parcelize
其实这并不是什么新的新闻了,早在 2019 年的时候,Google 就提出了不建议在项目中使用 kotlinx.android.synthetic
,详见这个 commit,部分内容如下图所示:
通过引入 kotlinx.android.synthetic
可以直接使用控件的 ID,这么方便为什么不建议使用?主要有以下问题:
- 通过 Kotlin 合成方法(Synthetic 视图)取代
findViewById
,这是通过全局空间缓存 ID,与 Layout 无关,没有针对 ID 进行无效检查 - 在不同的 Layout 文件中,使用了相同的 ID,或者删除了 ID ,它并不会提示空异常,导致增加了 App 的崩溃次数
- 仅仅支持 Kotlin
- 默认是通过
HashMap
缓存 ID 浪费空间,虽然可以通过在模块级build.gradle
文件内添加defaultCacheImplementation = "SPARSE_ARRAY"
来修改默认的实现方式为SparseArray
- ......
因此 ViewBinding 出现了,ViewBinding 解决了上述所有问题,ViewBinding 虽然好,但是也有它的不足之处。
- ViewBinding 相比于
kotlinx.android.synthetic
使用方式比较复杂 - 在
Activity
、Fragment
、Dialog
、Adapter
中 ViewBinding 和 DataBinding 初始化方式有些不同 - 需要单独处理
include
带merge
标签的布局,和不带merge
标签的布局等等 - DataBinding 结合 LiveData 一起使用需要做单独的处理
- ......