Android DataBinding
- 格式:docx
- 大小:94.05 KB
- 文档页数:6
Android DataBinding
Android数据绑定基础
我们在编写Android应用的时候,经常需要将数据显示到UI组件中,我们一般的写法是,首先通过findViewById()方法,获得各个组件对象,然后通过这些组件的setter方法,将数据更新到各个组件。如果数据有更新,再次调用组件的setter方法,更新到UI。
这种方式在用法上没什么问题,大家都是这么用。但如果做过Web开发的同学就知道,在Web开发中有一种数据绑定技术,可以让这种过程变得更加简单高效。它的基本思路是,将对象(属性)和对应的UI组件“绑定”在一起,当对象的属性有更新的时候,它将自动更新到UI而不需我们去调用组件的setter方法。
在Android M中,引入了Data Binding的功能(但不是在核心库中,因此需要额外的配置),我们可以通过简单的配置即可在Android应用中使用Data
Bindding的功能。本文即以一个简单地例子,讲解如何使用Data Binding。使用的开发环境是Android Studio 2。
在Android Studio中,首先在build.gradle中进行下面的配置:
dataBinding {
enabled true
}
然后,定义一个POJO类,如:
public class Student {
String name;
int age;
public Student(int age, String name) {
this.age = age;
= name;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
}
然后设置布局文件的根节点,根节点使用
name="student" type="cn.ucai.samples.databinding.pojo.Student" /> 其中,用name定义的student就类似于一个对象变量名称,后续在布局文件中可以使用它调用Student类的属性,type是完整的路径+类名。 然后,可以将不同的属性绑定在不同的组件上: android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@{,default=姓名}" /> android:id="@+id/textView2" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@id/textView1" android:text='@{""+student.age,default=18}' /> 使用@{}的方式,将Student的name属性绑定在第一个TextView,使用@{""+student.age}将Student的age绑定到第二个TextView,注意这里为了避免Android把int类型的值当做资源id,需要在前面加上一个空字符串。default用于设置默认值。在布局文件中,除了可以用“+”进行字符串连接外,还可以使用其他常用的操作符: 数学 + - / * % 字符串连接 + 逻辑 && || 二进制 & | ^ 一元运算 + - ! ~ 移位 >>>>><< 比较 == ><>= <= instanceof 分组 () null Cast(造型) 方法调用 数据访问 [] 三元运算 ?: 在Activity中,进行如下设置: ActivityMainBinding binding = DataBindingUtil.setContentView(this, yout.activity_main); Student student = new Student(19, "Ucai"); binding.setStudent(student); 其中,ActivityMainBinding为Android 帮我们自动生成的一个类。它是根据定义的Layout来生成的,即activity_main.xml会生成一个对应的ActivityMainBinding文件。然后调用它的setStudent()方法,将一个Student和布局绑定。其中的setStudent()方法是根据布局文件activity_main.xml中的设置来生成的: name="student" type="cn.ucai.samples.databinding.pojo.Student" /> 它会自动在ActivityMainBinding中生成一个setStudent(Student student)方法。这样,Student对象中的相关属性值,就会显示在绑定后的View中。其实它也生成了一个getStudent()方法,可以获取当前绑定的Student对象。 如果想让自动生成的类名为自己定义的一个类名,则可以在上加入以下设置: 这样,它将会生成一个StudentBinding的类,刚才的ActivityMainBinding类将不再可用。 自动更新数据变化到界面 在上面的代码中,在绑定数据后,如果数据发生了改变,是无法自动更新到界面中的。如果当POJO类对象中的对象发生改变的时候,需要让它反应到界面,我们可以让POJO类实现Observable接口,或者让它继承一个实现类BaseObservable(推荐这种方式),然后,给它的getXXX()方法加上@Bindable注解: @Bindable public String getName() { return name; } 此时,将会自动生成一个BR.java文件,其格式如下: public class BR { public static final int _all = 0; public static final int age = 1; public static final int name = 2; public static final int student = 3; } 接着,在POJO类的setXXX方法中,在其对应属性改变操作后,调用notifyPropertyChanged(int fieldId)来通知绑定了该POJO对象的组件更新内容,其中fieldId为对应该POJO类的一个id,可以通过BR.属性名来获取(就和通过R来获取各种资源类似),例如:、BR.age等。例如上面的的Student类,可以改成如下: public class Student extends BaseObservable { int age; String name; public void setAge(int age) { this.age = age; notifyPropertyChanged(BR.age); } public void setName(String name) { = name; notifyPropertyChanged(); } public Student(int age, String name) { this.age = age; = name; } @Bindable public int getAge() { return age; } @Bindable public String getName() { return name; } } 这样,当我们更新POJO对象的属性的时候,将会自动反应到UI中。 关于Android数据绑定其他高级功能,例如:集合操作、MVVM模式等,请关注我们后续的文章。