ButterKnife 替代计划
为什么要换掉 ButterKnift
- 库中使用的是
R2
,R2
点击不能跳转到具体的布局,对于问题定位有很大的干扰 - 不支持增量构建
对比一览
条目 | ViewBinding | DataBinding |
---|---|---|
定位 | 代替 findViewById | 作为数据到界面显示的桥梁 |
是否需要更改布局 | 不需要 | 需要在最外围加上<layout> (可以自动生成) |
能否进行数据绑定 | 不能 | 可以 |
能否和LiveData ,ViewModel ,LifeCycle 联动 |
不能 | 可以 |
ViewBinding 和 DataBinding
共同点
开启方法基本一致
都是在 gradle 配置开关
ViewBinding
android{
viewBinding {
enabled = true
}
}
DataBinding
android{
dataBinding {
enabled = true
}
}
对 View 操作基本一致
都是拿到 binding 对象,然后通过 binding
对象对 View
进行操作
private lateinit var binding: ResultProfileBinding
@Override
fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
binding = ResultProfileBinding.inflate(layoutInflater)
setContentView(binding.root)
}
都是为了安全
- Null 安全:由于视图绑定会创建对视图的直接引用,因此不存在因视图 ID 无效而引发 Null 指针异常的风险。此外,如果视图仅出现在布局的某些配置中,则绑定类中包含其引用的字段会使用 @Nullable 标记。
- 类型安全:每个绑定类中的字段均具有与它们在 XML 文件中引用的视图相匹配的类型。这意味着不存在发生类转换异常的风险。
不同点
定位不同
- ViewBinding 定位代替 findViewById
- DataBinding 定位是数据到界面展示的桥梁
可以直接看成 ViewBinding 是 DataBinding 的子集
对于 xml 要求不同
ViewBinding
不需要对 xml 进行更改DataBinding
需要在 xml 最外层 加上<layout>
这个根
DataBinding 多出来的功能
- 布局中数据绑定
- 能绑定
LiveData
和ViewModel
进行联动(生命周期监听) - 能直接扩展
View
的 XML 属性 - 能直接绑定动作,例如
onClick
,onLongClick
这些