DataBinding
DataBinding是Android UI团队推出的适合于MVVM开发模式的扩展包。
简单介绍一下使用方法,翻译整理自Google的文档 Android Developers:
1. 配置
在Module的build.gradle中加入下面的代码就配置好了:
dataBinding {
enabled true
}
2. layout
这时候XML已经不是单纯展示UI了。现在,我们要了原来的ViewGroup(各种线性、相对布局等等)外面,加入layout布局。和一个新的节点:data。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<!--data节点相当于View和Model中间的一座桥梁-->
<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节点中的variable描述了可能在layout中使用的属性。
<variable name="user" type="com.example.User"/>
其二,用"@{}"函数来描述属性对应的表达式。这里textView的值设置成user的firstName属性:
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"/>
3. Model
假设我们有一个叫作User的POJO:
public class User {
public final String firstName;
public final String lastName;
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}
这个Object的有着永远不会变的对象。在程序里只被读取一次,之后永远不变的data很常见。也可以使用Java Beans:
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;
}
}
从data binding的角度,这两个类是对等的,@{user.firstName}这个表达式会去前面的POJO面找firstName这个field,或者去Java Bean里面找getFirstName()方法。如果POJO里面存在firstName(),还是会去找firstName()方法。
4. Binding Data
默认地会根据layout文件生成一个Binding class,把这个layout文件转换成Pascal case,以"Binding"结尾(译注:这个文件要在build目录下去找)。上面的layout文件是main_activity.xml所以生成的类是MainActivityBinding。这个类包含了所有layout属性(比如user variable)和layout的View之间的bindings,并且知道如何通过binding表达式分配value。
最简单的创建binding的方法是在inflating的时候这样做:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//MainActivityBinding在build目录生成
MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
User user = new User("Larry", "Liu");
//自动生成了一个setUser方法,用来传递variable(例子里是user)
binding.setUser(user);
}
好了,这样程序就可以运行了。
另外,还可以这样获取View:
MainActivityBinding binding = MainActivityBinding.inflate(getLayoutInflater());
如果要绑定ListView或者RecyclerView的adapter里的item,还可以这样用:
ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false);
//or
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);
DEC 7