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. 这个类有两个字段: 一个叫 nameTextView 和一个叫 buttonButton, 布局文件中的 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 协议 ,转载请注明出处!