生成的绑定类

数据绑定库可生成绑定类,可用于访问 布局的变量和视图本文档介绍了如何创建和 自定义生成的绑定类。

生成的绑定类会将布局变量与 布局。您可以自定义 该绑定。所有生成的绑定类均继承自 ViewDataBinding 类。

系统会为每个布局文件生成一个绑定类。默认情况下, class 是通过 Binding 转换为 Pascal 大小写的布局文件的名称。 后缀。例如,如果布局文件名为 activity_main.xml,则对应的生成的类为 ActivityMainBinding。 此类包含从布局属性到布局的 查看并了解如何为绑定表达式赋值。

创建绑定对象

该绑定对象会在膨胀布局后立即创建 确保视图层次结构在绑定到具有 表达式。将对象绑定到 在绑定类上使用静态方法。您可以膨胀 视图层次结构,并使用inflate() 绑定类,如以下示例所示:

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val binding: MyLayoutBinding = MyLayoutBinding.inflate(layoutInflater)

    setContentView(binding.root)
}

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater());

    setContentView(binding.root);
}

inflate() 方法有另一个版本,该方法接受 ViewGroup 对象以及 LayoutInflater 对象,如 如以下示例中所示:

Kotlin

val binding: MyLayoutBinding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false)

Java

MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false);

如果布局使用其他机制膨胀,您可以将其绑定 如下所示:

Kotlin

val binding: MyLayoutBinding = MyLayoutBinding.bind(viewRoot)

Java

MyLayoutBinding binding = MyLayoutBinding.bind(viewRoot);

有时,您事先并不知道绑定类型。在这种情况下,您可以 使用 DataBindingUtil 类, 如以下代码段所示:

Kotlin

val viewRoot = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent)
val binding: ViewDataBinding? = DataBindingUtil.bind(viewRoot)

Java

View viewRoot = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent);
ViewDataBinding binding = DataBindingUtil.bind(viewRoot);

如果您在 FragmentListViewRecyclerView 则建议您使用 inflate() 绑定类或 DataBindingUtil 类,如 如以下代码示例所示:

Kotlin

val listItemBinding = ListItemBinding.inflate(layoutInflater, viewGroup, false)
// or
val listItemBinding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false)

Java

ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false);
// or
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);

带 ID 的视图

数据绑定库在绑定类中为 每个在布局中具有 ID 的视图。例如,数据绑定库 用于创建 firstNamelastName 字段,类型为 TextView,从 以下布局:

<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"
   android:id="@+id/firstName"/>
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.lastName}"
  android:id="@+id/lastName"/>
   </LinearLayout>
</layout>

该库从 单遍传递。与调用 findViewById() 方法。

在没有数据绑定的情况下,ID 并不是那么必要, 某些情况下需要从代码访问视图。

变量

数据绑定库会为声明的每个变量生成访问器方法 。例如,以下布局会生成 setter 和 getter userimagenote 变量的绑定类中的方法:

<data>
   <import type="android.graphics.drawable.Drawable"/>
   <variable name="user" type="com.example.User"/>
   <variable name="image" type="Drawable"/>
   <variable name="note" type="String"/>
</data>

ViewStubs

与普通视图不同,ViewStub 对象 一开始是不可见的视图当它们处于可见状态或明确膨胀时, 它们通过膨胀另一个布局在布局中自我替换。

由于 ViewStub 从视图层次结构中消失,因此 绑定对象也必须消失,以便通过垃圾回收进行回收。 由于观看次数是最终的 ViewStubProxy 对象 替换生成的绑定类中的 ViewStub, 访问 ViewStub(如果存在)以及访问膨胀的视图 膨胀 ViewStub 时的层次结构。

膨胀另一个布局时,必须为新布局建立绑定。 因此,ViewStubProxy 必须监听 ViewStub OnInflateListener 并根据需要建立绑定关系。由于每个路径中只能存在一个监听器 ViewStubProxy 会让您设置 OnInflateListener,它会调用 并在建立绑定后使用。

立即绑定

当变量或可观察对象发生变化时,绑定会按计划发生变化 在下一帧之前呈现不过,有时必须执行绑定 。要强制执行,请使用 executePendingBindings() 方法。

动态变量

有时,特定绑定类未知。例如, RecyclerView.Adapter 针对任意布局进行操作并不知道特定的绑定类。它 必须在调用 onBindViewHolder() 方法。

在以下示例中,RecyclerView 绑定到的所有布局都具有 item 变量。BindingHolder 对象具有 getBinding() 方法 返回 ViewDataBinding 个基地 类。

Kotlin

override fun onBindViewHolder(holder: BindingHolder, position: Int) {
    item: T = items.get(position)
    holder.binding.setVariable(BR.item, item);
    holder.binding.executePendingBindings();
}

Java

public void onBindViewHolder(BindingHolder holder, int position) {
    final T item = items.get(position);
    holder.getBinding().setVariable(BR.item, item);
    holder.getBinding().executePendingBindings();
}

后台线程

您可以在后台线程中更改数据模型,只要它不是 。数据绑定会在评估期间将每个变量或字段本地化, 避免任何并发问题

自定义绑定类名称

默认情况下,系统会根据布局文件的名称生成绑定类, 以大写字母开头,删除下划线 ( _),将 并加上单词“Binding”的后缀。例如,布局文件 contact_item.xml 会生成 ContactItemBinding 类。课程已放置 位于模块软件包下的 databinding 软件包中。例如,如果模块 package 是 com.example.my.app,则绑定类会放置在 com.example.my.app.databinding 软件包。

通过调整 data 元素的 class 属性。例如,以下布局 在 databinding 软件包中生成 ContactItem 绑定类, 当前单元:

<data class="ContactItem">
    ...
</data>

您可以在其他软件包中生成绑定类,只需为该类添加前缀即可 名称中带有句点。以下示例在 module 软件包:

<data class=".ContactItem">
    ...
</data>

您还可以在指定绑定类的位置使用完整的软件包名称 。以下示例在ContactItem com.example 软件包:

<data class="com.example.ContactItem">
    ...
</data>

其他资源

如需详细了解数据绑定,请参阅下面列出的其他资源。