viewbinding
1.作用:代替findViewbyid
2.什么是 View Binding ?
View Binding 是一项使你能更轻松地编写与视图交互的代码的功能. 在模块中启用 View Binding 后, 它会为该模块中存在的每一个 XML 文件生成一个对应的绑定类(binding class). 绑定类的实例包含了对应布局中所有具有 ID 的 view 的直接引用.
大多数情况下, View Binding 可以替换 findViewById.
3.为什么不是 Data Binding ?
- 只有布局文件的根标签是 `` 时, Data Binding 才会生成对应的 binding class, View Binding 没有这样的要求;
- Data Binding 会影响构建的速度. Data Binding 底层其实是通过 annotation processor 实现的, 对构建速度是有负面影响的. 而 View Binding 并不是通过 annotation processor 实现的, 因此解决了 Data Binding 的性能问题.
4.如何使用 View Binding ?
使用要求
你至少需要使用 Android Studio 3.6 Canary 11 及以上版本 才可以开启 View Binding.
设置指南
View Binding 可以逐模块(module)开启. 比如我们的项目由 2 个模块(A 和 B)组成, 我们可以选择只在模块 A 启用 View Binding 而不会对模块 B 产生影响. 在模块中启用 View Binding, 首先需要在该模块的 build.gradle
文件中添加以下代码:
android {
...
viewBinding {
enabled = true
}
}
如果想要在生成 binding class 时忽略某个布局文件, 我们需要在该布局文件的根元素添加 tools:viewBindingIgnore="true"
属性.
<<LinearLayout
...
tools:viewBindingIgnore="true" >
...
LinearLayout>
使用方法
和 Data Binding 一样, View Binding 会将 XML 文件的下划线风格的名称转换生成一个驼峰风格并以 Binding
结尾的 binding class.
例如我们有个 result_profile.xml
布局文件:
<LinearLayout <LinearLayout ... >
<TextView android:id="@+id/name" />
<ImageView android:cropToPadding="true" />
<Button android:id="@+id/button"
android:background="@drawable/rounded_button" />
LinearLayout>
生成的 binding class 的名称就是 ResultProfileBinding
. 这个类有两个字段: 一个叫 name
的 TextView
和一个叫 button
的 Button
, 布局文件中的 ImageView
因为没有 ID, 所以 binding class 中没有对其的引用.
每一个 binding class 都包含了一个 getRoot()
的方法, 提供了一个相应布局文件的根 view 的直接引用. 在上面的例子中, ResultProfileBinding
类中的 getRoot()
方法返回了根 view LinearLayout
.
我们可以调用 inflate()
静态方法来获取生成的 binding class 的实例. 通常来说, 你需要调用 setContentView()
方法, 将生成类的根 view 作为参数传递, 作为屏幕上的内容. 在上面的例子中, 我们可以在 activity 中调用 ResultProfileBinding.inflate()
.
private lateinit private lateinit var binding: ResultProfileBinding
@Override
fun onCreate(savedInstanceState: Bundle) {
super.onCreate(savedInstanceState)
binding = ResultProfileBinding.inflate(layoutInflater)
setContentView(binding.root)
}
然后就可以通过 binding class 引用任何 view:
binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!