步骤一 首先定义好一个普通的JavaBean,这就是控件需要的数据源,不需要做任何的特殊处理。
步骤二 修改布局成databinding布局
进入activity的布局文件,鼠标放到根布局上,然后同时按住alt+enter打开系统提示框。由于我们之前在build.gradle中设置了打开dataBinding,所以当前会出现Convert to data binding layout选项,顾名思义就是转换成dataBinding支持的布局模式,选择该选项即可。
选择好了该模式以后,布局文件大概就会变成这样子。布局最外层给自动加上了layout便签,包裹了我们最初的根布局。其次,系统自动生成了和之前的根布局同级。
接下来只需要在data标签里面配置好系统自动生成类的类名,以及属性即可。其中variable中name有两个作用,第一是使用该数据源,第二个是用来自动生成更新数据时调用的方法名,type指定好前面我们写好的那个bean即可。在控件上使用时只需要通过@{name.field}的方式设置在控件上即可,当然这里以TextView为例,ImageView需要特殊处理,后面会讲到。
经过以上的准备工作,接下来就要开始正式使用了。我这里打开了一个线程,然后每过一秒变化一下数据源,注意每次修改了数据源,最后都需要调用setTestVariable方法才能生效
运行效果如下:
效果符合预期,每过一秒就自动更新数据,而我们并没有对TextView进行setText操作。
我们成功地实现了在数据源变化的时候自动设置到ui上面,也仅仅是实现了功能而已,但是这种方法非常地笨拙,每次数据源更新的时候还要给dataBinding重新设置数据源,操作很麻烦,那有没有只需要写一遍就可以初始化数据源,从而一劳永逸的办法呢?答案是有的,接下来,我们来看看方式2。
方式2、利用@Bindable注解以及官方的notifyPropertyChanged方法来实现
xml文件不需要变,按照方式1的写法就可以了,只需要在Bean的字段的get方法上面加上@Bindable注解,然后在字段的set方法里调用一下notifyPropertyChanged方法即可,需要注意的是,必须要继承BaseObservable才会有该方法。其中@Bindable是告诉DataBinding在可以调用getName方法来获取name的值,notifyPropertyChanged方法是告知DataBinding当前数据已修改,快去调用get方法获取最新数据吧!所以不用重新设置数据源的原因大家也都看出来了,其实就是在给Bean设值的时候通知了DataBinding,然后DataBind自动去更新了。