这篇以前在简书写的blog,由于已经不会在简书写东西了,就搬过来这边
前言
在项目中使用到了DataBinding,深感它的优秀,于是进行分享。
什么是DataBinding
DataBinding,数据绑定,可以直接在xml中绑定数据并实现一些处理逻辑,实时动态刷新数据。它的功能强大,可以节省很多手写的代码,而且性能也很好。
DataBinding的优点和缺点
优点
上面说了它的性能很好,因为它0反射,而且性能比直接findViewById要高。可以查看DataBinding的源码:
还有它生成的实体类:
一个Activity会有一个Window对象,而一个Window对象也有一个DecorView。DecorView是一个ViewGroup,布局文件都是通过inflate转化为view,加入到DecorView中,可以说DecorView是最大的根布局,而这个android.R.id.content正是它的id。DataBinding通过获取这个根布局,然后通过for循环将里面的控件一个个return出去,然后在生成的实体类再一个个获取。这样子的效率比直接findViewByid要效率的多,因为每次findViewByid都需要进行一次for循环在ViewGroup里面来寻找指定id名的控件。
缺点
目前AS对DataBinding在xml编写时还是不太友善的,代码自动补全功能做得还是有点差,这个有待Google日后的改善。
怎么使用 DataBinding
使用方法很简单,Gradle 1.5 alpha 及以上自带支持 DataBinding,仅在app模块的build.gradle中加上几行代码就可以使用了:
android {
...
dataBinding {
enabled = true
}
...
}
将一个layout变成DataBinding的layout也很简单的:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
//原来的layout 代码
</layout>
当我们将layout改造完成后,DataBinding就会自动生成对应的编译文件了。假如没有,可以make project一下。
而编译文件的命名一般都是通过xml的文件名生成,如activity_main.xml,则会生成ActivityMainBinding,item_list_name则会生成ItemListNameBinding。
动态更新数据
上面有提到过的,DataBinding可以实时动态刷新数据。这是通过继承DataBinding的BaseObservable来做到的。
public class InfoBean extends BaseObservable{
private String unit;
private String rental;
private List<String> list;
public InfoBean(String unit, String rental,List<String> list) {
this.unit = unit;
this.rental = rental;
this.list = list;
}
@Bindable
public String getUnit() {
return unit;
}
public void setUnit(String unit) {
this.unit = unit;
notifyPropertyChanged(BR.unit);
}
public String getRental() {
return rental;
}
public void setRental(String rental) {
this.rental = rental;
}
@Bindable
public List<String> getList() {
return list;
}
public void setList(List<String> list) {
this.list = list;
notifyPropertyChanged(BR.list);
}
}
BR.java是类似R.java的资源文件,是 Binding Resources 的缩写,由框架自动生成。
注意,BR 中的 id 生成的依据是 @Bindable 修饰的方法名 getXXX(),而非方法体的内容。当在 getXXX() 方法前加 @Bindable 之后,BR.java中会自动生成常量BR.XXX。如果觉得自动生成速度不够快,也可以试下make project一下。
DataBinding还提供了其他已经实现好的BaseObservable子类,包括 ObservableBoolean, ObservableByte, ObservableChar, ObservableShort, ObservableInt, ObservableLong, ObservableFloat, ObservableDouble, 和ObservableParcelable。
它们在xml中,使用方法和普通的String,int一样,只是会自动刷新,但在java中访问则会相对麻烦,因为它是通过get/set方法来进行获取和修改的。这里使用ObservableBoolean来举个例子吧:
public ObservableBoolean Show = new ObservableBoolean(true);
...
Boolean flag = Show.get();
Show.set(false);
简单的使用
1.xml的逻辑
上面有提到过,DataBinding是可以在xml里面写一些处理逻辑的。我们将一个layout文件改成DataBinding模式后,通过DataBinding的data标签,我们可以很轻松给控件绑定文本等属性和绑定点击方法的。我们来看下面这一段的xml逻辑吧:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="android.view.View" />
<variable
name="presenter"
type="com.fritz.demo.DemoActivity.DemoPresenter" /