1.前言
DataBinding是2015年在Google I/O上,伴随着Android M预览版发布的Data Binding兼容函数库。它的官方文档地址:https://developer.android.com/topic/libraries/data-binding/。说起DataBinding就不得不提MVVM(Model–View–ViewModel),MVVM实现了View和Model的双向绑定,当View有输入的时候,ViewModel通知Model更新数据,同理,Model数据更新后,ViewModel也会通知View更新。
优点:
使用方式:避免过多的冗余代码;
数据操作:监控数据的变化,实时更新;
事件处理:直接找到目标实例处理用户操作的事件,将数据与UI进行分离;
效率:通过注解解决绝大多数的重复工作,并且没有使用反射,不影响程序的运行效率;
2.使用
DataBinding是一个support library,所以它可以支持所有的android sdk,最低可以到android2.1(API7)。
使用DataBinding需要Android Gradle插件的支持,版本至少在1.5以上,需要的Android studio的版本在1.3以上。
他的布局文件与我们平时的布局文件稍有不同,图2是一个使用了DataBinding的布局文件,变量user作为被绑定的数据,在
2.1表达式:
布局中的表达式使用@{}语法写入属性参数,例如图3中的@{user.lastName}
关于空指针:自动生成的DataBinding代码会检查null异常,如果取值为null,会自动设置默认值而不会让程序崩溃。
资源文件的引用在表达式中的写法:
android:padding="@{large? @dimen/largePadding : @dimen/smallPadding}"可以看出他是支持三元运算的;
格式字符串和复数可以通过提供参数来计算:
android:text="@{@string/nameFormat(firstName, lastName)}"
android:text="@{@plurals/banana(bananaCount)}"
备注:数据绑定不支持include作为合并元素的直接子元素。
数据类型的对象无论是使用构造方法传入,还是JavaBean的方式,对于数据绑定的角度来看都是等价的。
这里图3的TextView的android:text属性的@{user.lastName}表达式将访问getLastName()方法。
AS会根据layout文件自动生成一个默认的Binding类,类名是根据layout文件名生成的,后缀以“Binding”结束(当然如果不喜欢这个生成的名字也可以更改),...标签下自定义名称。
使用DataBinding方式的布局文件后,要用DataBindUtil.setContentView来代替setContentView。
2.2事件绑定
Databinding事件绑定,分两种方式:方法引用和监听绑定。
区别主要在于方法引用实际的监听器实现是在绑定数据的时候创建的,而不是在事件触发的时候创建的。
2.2.1方法引用
事件可以直接绑定到处理方法,类似于android:onClick。
绑定的值是要调用的方法的名称。如图6所示。
2.2.2监听绑定
监听器绑定是在事件发生时候运行的绑定表达式,支持lambda表达式。
当事件触发的时候,数据绑定将计算给定的表达式,
需要注意的是:此功能在 Android Gradle Plugin version 2.0 或更新版本上可用;
表达式返回值的类型必须与监听事件的返回值类型相同。
如果由于null对象无法计算此表达式,数据绑定将返回该类型的默认Java值。例如,引用类型返回null,int类型返回0,boolean类型返回false;
2.2.3双向绑定
在属性绑定的时候使用@=的方式来双向绑定,使用了双向绑定,在EditText中输入内容,就会自动存储到对应的字段上,如果还有其它View单向绑定了这个值,它的显示也会发生变化。
3.在Fragment,自定义View中的使用
fragment中没有setContent方法,所以实例化databinding的方式不一样,
4. Observable
一个纯的Java Model类在被修改后,UI并不会更新。如果想在数据绑定后修改数据模型的值就可以更新UI,可以通过使用Observable,配合@Bindable注解与notifyPropertyChanged一起来达到效果。如图4,修改数据Model的值后UI会自动更新。
4.1 ObservableField
如果一个Model里的的有字段都要示修改后自动更新UI,像图4那样使用会产生很多冗余的代码,我们可以通过把字段定义为ObservableField就可以达到目的。ObservableField提供的类型举例如下:
ObservableBoolean
ObservableByte
ObservableInt
ObservableChar
ObservableLong
ObservableFloat
ObserbableDouble
ObservableParcelable
5.自定义属性
使用databinding实现自定义属性不需要去style里定义,可以在xml文件里直接设置属性,框架会根据全名空间去查找对应的set方法,当然如果找不到方法就会报错。
6.注解介绍
6.1@Bindable
被@Bindable注解的get方法对应的变量会在BR资源中生成一条记录,它和notifyPropertyChanged(BR.*)配合起来可实现数据模型值修改后自动更新到UI。
7.缺点
DataBinding在xml提供了丰富的操作符,但是由于Android studio天生的xml语法检查的贫弱,xml布局中的表达式逻辑错误,不能准确定位,导致debug难度增加,事实上一些BindingAdapter的错误在build的时候也会被提示xml错误。