注:没有完全按照原文翻译,加入了一点自己的理解。
数据绑定指南
这篇文档解释怎样去写出描述性的布局以及最小化关联代码用来绑定你的应用程序逻辑和布局。
这个Data Binding Library 提供灵活的 ,宽泛的兼容性——它是个支持库,可以用它在Android2.1(API 7+)以上的系统。使用这个库需要Gradle插件1.5-alpha1或者更高的版本
Buid环境
为了使用Data Binding Library ,先在SDK Manager的Support repository中下载Library。为了配置好你的APP来数据绑定,你需要增加dataBinding元素在Module模块的Build.gradle中,实例如下:
android { .... dataBinding { enabled = true } }假如你APP Module依赖的Library使用了数据绑定,你的APP Module模块也必配置好数据绑定在Module的Build.gradle文件。同时,保证你使用了兼容的Android studio.Android
Studio 1.3及其以后的版本提供数据绑定支持。
数据绑定布局文件
写你的第一个数据绑定语句
数据绑定文件布局有一点点不同于普通的布局文件,开始根标志是layout,之后是data元素和View的根元素。View的根元素就是在没有数据绑定情况下布局文件的根元素。举个例子:
<?xml version="1.0" encoding="utf-8"?> <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}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.lastName}"/> </LinearLayout> </layout>data里面的变量user描述了一个你可能需要在布局文件中使用的属性
<variable name="user" type="com.example.User"/>在布局文件中写入数据值利用"@{}"的语法,下面这个文本控件的文本设置为了user的firstName属性:
<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.firstName}"/>数据对象
让我们假设你有一个User的简单java对象(POJO)
public class User { public final String firstName; public final String lastName; public User(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } }这种类型的对象拥有不会改变的数据。在应用程序中拥有一个只读取一次,之后不会再改变的数据是很常见的。它也可能是一个JavaBean对象:
public class User { private final String firstName; private final String lastName; public User(String firstName, String lastName) { this.firstName = firstName; this.lastName = lastName; } public String getFirstName() { return this.firstName; } public String getLastName() { return this.lastName; } }从数据绑定的观点来看,有两个类是等价的,使用在TextView的android:text属性语句@{user.firstName}将在前面的类中获取firstName域的值,而在后面的类中通过getFirstName()来获取。作为一种选择,它也将被解析为firstName()方法,如果这个方法存在。
绑定数据
默认情况下,把布局文件的名字进行转换生产一个Binding类,这个类的名字是符合PascalCase规则(注:即单词首字母大写无连接符号拼接)以及后缀为"Binding"的。上面的布局文件in_activitiy.xml ,因此生产的类为MainActivityBinding.这个类拥有所有布局的绑定属性(例如用户变量这个类拥有所有布局的绑定属性(例如用户变量)布局的视图和知道如何赋值绑定表达式。最简单的方法来创建绑定而膨胀)布局的视图和知道如何赋值绑定表达式。最简单的方法来创建绑定在填充的时候。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity); User user = new User("Test", "User"); binding.setUser(user); }上面这些你就已经完成了!运行你的APP,可以在看到Test User在的用户界面上。另外,你可以获取View通过:
MainActivityBinding binding = MainActivityBinding.inflate(getLayoutInflater());如果您正在使用数据绑定项目在列表视图或RecyclerView适配器,您可能更愿意使用:
ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false); //or ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);绑定事件
事件可能直接被绑定到handler方法,类似的方式在android:onClick能直接关联到Activity中的一个方法。除了少数的情况,事件属性名字是通过监听方法的名字来管理。举个例子,View.onLongClickListener 有一个方法onLongClick(),因此这个属性相关的事件是android:onLongClick
public class MyHandlers { public void onClickFriend(View view) { ... } public void onClickEnemy(View view) { ... } }这个绑定语句能分配一个一个视图的点击事件。
<?xml version="1.0" encoding="utf-8"?> <layout xmlns:android="http://schemas.android.com/apk/res/android"> <data> <variable name="handlers" type="com.example.Handlers"/> <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:onClick="@{user.isFriend ? handlers.onClickFriend : handlers.onClickEnemy}"/> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{user.lastName}" android:onClick="@{user.isFriend ? handlers.onClickFriend : handlers.onClickEnemy}"/> </LinearLayout> </layout>
注:如果在主类中使用需要类似的设置binding.setMyHandler(new MyHandler);
--------复杂用法以后再翻译