Data-Binding(二):include标签的使用

在上一篇《不要再使用findViewById》中你看到如何通过AS 1.5以上的版本避免使用findViewById的。这本质上其实是这个View Holder父类如下的描述:

> Making ListView Scrolling Smooth

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<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,可以被简单的调用:

1
2
3
4
5
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(四):事件监听
-------------The End-------------
请我喝一杯啤酒~