原文地址: https://medium.com/google-developers/android-data-binding-that-include-thing-1c8791dd6038#.jxnxq3463
在上篇文章中, 讲述了在Android Studio1.5及之后的版本上, 使用data binding来替代findViewById是多么简单的一件事. 我展示了如何使用Android Studio来基于layout文件生成一个类似ViewHolder的类.但是如果layout中使用了 "include" 或 "merge"标签怎么办?
Data Binding默认也支持这些标签, 但是每个layout文件都会被生成一个不同的类. 例如
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”);
include标签的命名规则跟View的命名规则是一样的: "include"标签的id被
当作成员变量名. 被include的layout文件会生成一个自己的类, 里面的view
也会被赋值给成员变量. 开发者也可以很容易的分别共享的id, 例如如果你
include了一个layout两次:
<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, 否则不会为其生成公共成员变量. 同时,记住在外面
使用 <layout> 标签. 这回触发预处理过程, 生成类并绑定view.
如果你去查看生成的类, 会发现无论被include多少次, 他们使用的都是同一个类.
例如你有另外一个layout文件goodbye_world.xml也包含了included_layout.xml文件,那么只会生成一个类.
网友评论