**Data Binding**顾名思义就是数据绑定,2015年谷歌I/O大会上发布了DataBinding,它是一个数据绑定框架,是一种对MVVM的实现,MVVM模式就相当于把 MVC模式中的 C 层换成了VM也就是 ViewModel 层。ViewModel仅仅用来显示数据的,对于复杂的数据业务逻辑不处理,所以更偏向于View。Data Binding中使用到了ViewModel,它会把ViewModel绑定到 XML文件中,保证View中的数值来源都是来自ViewModel,降低布局和逻辑的耦合性,使代码逻辑清晰,可以提高开发效率,性能高,功能强大!
**开发环境要求**:
Gradle插件至少在1.5.0更高,Android studio的版本在1.3.0或更高,可以在Android 2.1(API7+)上使用它。
**基本用途:**
1.去掉了activity,fragment中的80%的UI代码,减少定义View的Id的,不用再去findViewById,自动绑定好Id ,不会因为id错出现crash。
2.XML变成了UI的唯一真实来源。通过使用Data Binding,XML中的View数值来源都是data标签中的变量,数据来源比较唯一。
3.保证执行在主线程
**绑定表达式使用以下运算符和关键字:**
1.一元运算符:+ 、- 、!等
2.二元运算符: &(与) 、 | (或) 、^(异或)
3.移位运算符:>> 、 >>> 、<<
4.比较运算符:>= 、 >、 <= 、 < 、== (请注意,< 需要转义为 <)
5. instanceof 直接可以看这个实例是不是某个类的继承
6.分组运算符 ()
7.在文字上支持character、String、null、numeric
8.cast(类型转换)
9.方法调用 (可以用“.”点号,也可以用两个"::"冒号来调方法名)
10.Field访问(get函数....)
11.Array访问,直接在 xml中访问数组,指定下标访问数组中元素,但是要注意数组越界的问题
12.三元运算符?:
13空合并运算符 (例子 android:text="@{user.displayName ?? user.lastName}"完全等价于android:text="@{user.displayName != null ? user.displayName : user.lastName}")
14.自动空指针检查 (例子 {user.displayName} ->null 如果user类为空,那么自动赋值为null。{user.age} ->0如果user类为空,那么自动赋值为0。)
15.Margin @dimen+@dimen (例子 android:layout_margin="@{@activity_horizontal_margin+@activity_verticall_margin}" )
**表达式语法不支持以下操作:**
1.this 不能在xml中访问this关键字
2.super 不能在xml中调用父类的方法
3.new 不能在xml中new出实列
4.不支持显示泛型调用<T>
**Include标签**
1.在使用了 app 命名空间的布局中,可以将变量传递到include布局的绑定中,以下示例显示了将user变量传递到name.xml和contact.xml布局文件中(前提是name.xml和contact.xml布局中声明了user变量):
2.数据绑定不支持 include直接作为merge的子元素,根布局必须是ViewGroup,换句话说,外层必须要有LinearLayout、RelativeLayout等像这样的容器裹着,才不会出现生成的某些view被覆盖的问题出现。例如,**不支持以下布局:**
**Observable**是个接口,Google为我们提供了一个BaseObservable类,我们只要把Model类继承自它,就获得了通知UI更新数据的能力了,然后再getter方法上添加Bindable注解,在setter方法中使用notifying提醒UI更新数据。如:
Google也推出ObservableFields类,使用它我们可以简化我们的Model类,如:
那一堆代码就变成了两行,然后通过:
设置和获取数据,更新UI。当然ObservableField<T>中传入的泛型可以是java中的基本类型,当然我们还可以使用 ObservableBoolean, ObservableByte, ObservableChar, ObservableShort, ObservableInt, ObservableLong, ObservableFloat, ObservableDouble, ObservableParcelable等具体的类型,效果也和ObservableField<T>是一样的,如:
而且Google也为我们提供了一些通知类型的集合,有这三种:ObservableArrayList<T>、ObservableArrayMap<K,V>、ObservableMap<K,V>,它和平场使用的List、Map用法一样,但是多了通知功能。
我们在layout中的<data>区域导入包后就可以直接用它了,当它内部的数据发生改变时就自动会通知UI界面更新。如:
**高级绑定,动态变量**
1.立即绑定。变量或Observable改变后,会在下个帧进行绑定的改变,如果需要立即执行,可以执行executePendingBindings() 方法。
2.后台线程。data binding会本地化变量/值域,以避免同步问题(但对collection不行)。
动态变量多用于RecyclerView,有时候item布局样式不是单一的,存在多种布局,那么就会存在多种ViewHolder 类型。在发生数据绑定的时候,我们并不知道绑定的是哪个layout,ViewHolder的实例是哪一个,这时候就可以在onBindViewHolder函数里面加入以下类似代码:
final T item=mltems.get(position); //根据位置拿到item的数据
holder.getBinbgding().setVariable(BR.item,item); //在所有的item的Variable里面都定义同样的名字叫“item”,这样就可以绑定到对应的layout了
holder.getBinding().exectePendingBindings(); //因为RecyclerView的view是重用的,所以要立即刷新
**Bingding生成**
1.默认生成规则,下划线分割,大写开头 如activity_main.xml ->ActivityMainBinding
2.自定义class, <data class ="LionActive> .......生成的Bingding就是LionActive
最后附上官方的使用教程:https://blog.gokit.info
今天的分享结束了,再见~
网友评论