前言:Data Binding 解决了 Android UI 编程中的一个痛点,官方原生支持 MVVM 模型可以让我们在不改变既有代码框架的前提下,非常容易地使用这些新特性。其实在此之前,已经有些第三方的框架(RoboAndroid) 可以支持 MVVM 模型,无奈由于框架的侵入性太强,导致一直没有流行起来。
1.准备:
Android Studio 更新到1.3或者更高
2.注意:
Data Binding 是一个 support 包
3.新建一个Project:
u 修改Project的Build.gradle,为 build script 添加一条依赖。
classpath "com.android.databinding:dataBinder:1.0-rc1"
u 为用到 Data Binding 的模块添加插件,修改对应的 build.gradle
applyplugin: ‘com.android.databinding‘
工程创建完成后,我们通过一个最简单的例子来说明 Data Binding 的基本用法。
- 布局文件
使用 Data Binding 之后,xml的布局文件就不再单纯地展示 UI 元素。所以,它的根节点不再是一个 ViewGroup,而是变成了 layout,并且新增了一个节点 data,如下:
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<import type="com.example.siyan.sample.Person" />
<variable
name="user"
type="Person" />
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}"
android:textSize="20sp" />
</LinearLayout>
在Layout中data节点,声明一个variablea子节点,然后就可以在Layout中使用了。Type属性可以是JavaBean、POJO(实际就是Java类),注意:Type应该是全路径。name属性为这个类的引用起的一个别名。如下:
<data>
<variable
name="user"
type="com.example.siyan.sample.Person" />
</data>
当然,还可以使用下面这一种写法。如下所示:
<data>
<import type="com.example.siyan.sample.Person" />
<variable
name="user"
type="Person" />
</data>
布局里面使用表达式"@{}"设置object的value。如下所示:
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}" />
android:textSize="20sp" />
public class Person {
public final String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
- 绑定数据
用 DatabindingUtil.setContentView() 来替换掉 setContentView(),然后创建一个 user 对象,通过 binding.setUser(user) 与 variable 进行绑定如下所示:
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//注意AMainBinding 是根据布局名字怎么生成的
AMainBinding dataBinding = DataBindingUtil.setContentView(this, R.layout.a_main);
Person p = new Person("传智播客");
dataBinding.setUser(p);
}
AMainBinding类是自动生成的,所有的 set 方法也是根据 variable节点的name属性生成的。
至此,一个简单的数据绑定就完成了。运行上述程序,效果如图所示: