在上一篇[《不要再使用findViewById》](http://www.domon.cn/2016/10/26/data_binding_do_not_use_findviewbyid)中你看到如何通过AS 1.5以上的版本避免使用findViewById的。这本质上其实是这个View Holder父类如下的描述:

Making ListView Scrolling Smooth

我演示了如何使用AS生成一个作用于单一的布局文件的View Holder类,但是如果这个布局文件是中包含有其他的布局中的呢?又或是这个布局文件是合并于其他布局之中呢?

最终证明这些都是可以支持的,但是不同的布局文件生成不同的类。下面是一个例子:

hello_world.xml

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

        <TextView
                android:id="@+id/hello"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
        <include
                android:id="@+id/included"
                layout="@layout/included_layout"/>
    </LinearLayout>
</layout>

included_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/world"/>
</layout>

你可以通过下面的方法访问这两个不同的TextView:

HelloWorldBinding binding =
    HelloWorldBinding.inflate(getLayoutInflater());
binding.hello.setText(“Hello”);
binding.included.world.setText(“World”);

对于included的模式同样运用在其他Views中:对于标签的ID被用作其类的字段名。所包含的布局,它产生了自己的类以及自己在其布局中的Views字段。所有的IDs都可以被开发者简单的在不同的两个布局中调用。例如,若你引用同样的布局两次:

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical">

        <TextView
                android:id="@+id/hello"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"/>
        <include
                android:id="@+id/world1"
                layout="@layout/included_layout"/>
        <include
                android:id="@+id/world2"
                layout="@layout/included_layout"/>
    </LinearLayout>
</layout>

这两个「world」TextView,可以被简单的调用:

HelloWorldBinding binding =
    HelloWorldBinding.inflate(getLayoutInflater());
binding.hello.setText(“Hello”);
binding.world1.world.setText(“First World”);
binding.world2.world.setText(“Second World”);

记住需要给你include的标签一个ID,并且不能是公共的字段。而且,记住通过使用外层的布局去生成你所需要的字段。这将会出发预处理步骤,允许其与规定字段的Views相关联并产生一个类。

如果你深入的去看生成的类,你将会看到,他们其实在引用的任何时间都是使用的相同的一个。例如,如果你有一个goodbye_world.xml类,其中包含一个included_layout.xml,只会有一个类产生。

原始文章地址


历史文章记录:

  1. Data-Binding(一):别在使用FindViewById()了
  2. Data-Binding(二):include标签的使用
  3. Data-Binding (三):让View-Id不再那么必要
  4. Data Binding(四):事件监听