欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android DataBinding 快速上手

程序员文章站 2022-07-04 16:30:12
Data Binding顾名思义就是数据绑定,2015年谷歌I/O大会上发布了DataBinding,它是一个数据绑定框架,是一种对MVVM的实现,MVVM模式就相当于把 MVC模式中的 C 层换成了VM也就是 ViewModel 层。ViewModel紧紧用来显示数据的,对于复杂的数据业务逻辑不处理,所以更偏向于View。Data Binding中使用到了ViewModel,它会把ViewModel绑定到 XML文件中,保证View中的数值来源都是来自ViewModel,降低布局和逻辑的耦合性,使代码逻辑...

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.比较运算符:>= 、 >、 <= 、 < 、== (请注意,< 需要转义为 “&lt ;”)
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.不支持显示泛型调用

Include标签
1.在使用了 app 命名空间的布局中,可以将变量传递到include布局的绑定中,以下示例显示了将user变量传递到name.xml和contact.xml布局文件中(前提是name.xml和contact.xml布局中声明了user变量):

Android DataBinding 快速上手

2.数据绑定不支持 include直接作为merge的子元素,根布局必须是ViewGroup,换句话说,外层必须要有LinearLayout、RelativeLayout等像这样的容器裹着,才不会出现生成的某些view被覆盖的问题出现。例如,不支持以下布局:

Android DataBinding 快速上手

Observable是个接口,Google为我们提供了一个BaseObservable类,我们只要把Model类继承自它,就获得了通知UI更新数据的能力了,然后再getter方法上添加Bindable注解,在setter方法中使用notifying提醒UI更新数据。如:
Android DataBinding 快速上手

Google也推出ObservableFields类,使用它我们可以简化我们的Model类,如:
Android DataBinding 快速上手
那一堆代码就变成了两行,然后通过:
Android DataBinding 快速上手
设置和获取数据,更新UI。当然ObservableField中传入的泛型可以是java中的基本类型,当然我们还可以使用 ObservableBoolean, ObservableByte, ObservableChar, ObservableShort, ObservableInt, ObservableLong, ObservableFloat, ObservableDouble, ObservableParcelable等具体的类型,效果也和ObservableField是一样的,如:
Android DataBinding 快速上手
而且Google也为我们提供了一些通知类型的集合,有这三种:ObservableArrayList、ObservableArrayMap<K,V>、ObservableMap<K,V>,它和平场使用的List、Map用法一样,但是多了通知功能。
我们在layout中的区域导入包后就可以直接用它了,当它内部的数据发生改变时就自动会通知UI界面更新。如:Android DataBinding 快速上手
Android DataBinding 快速上手
Android DataBinding 快速上手
高级绑定,动态变量
1.立即绑定。变量或Observable改变后,会在下个帧进行绑定的改变,如果需要立即执行,可以执行executePendingBindings() 方法。
2.后台线程。data binding会本地化变量/值域,以避免同步问题(但对collection不行)。
动态变量多用于RecyclerView,有时候item布局样式不是单一的,存在多种布局,那么就会存在多种ViewHolder 类型。在发生数据绑定的时候,我们并不知道绑定的是哪个layout,ViewHolder的实例是哪一个,这时候就可以在onBindViewHolder函数里面加入以下类似代码:

//根据位置拿到item的数据
final T item=mltems.get(position);

//在所有的item的Variable里面都定义同样的名字叫“item”,这样就可以绑 定到对应的layout了
holder.getBinbgding().setVariable(BR.item,item);

//因为RecyclerView的view是重用的,所以要立即刷新
holder.getBinding().exectePendingBindings();

Bingding生成
1.默认生成规则,下划线分割,大写开头 如activity_main.xml ->ActivityMainBinding
2.自定义class, <data class ="LionActive> …生成的Bingding就是LionActive

最后附上官方的使用教程:https://blog.gokit.info

本文地址:https://blog.csdn.net/yanhuomatou2015/article/details/108658682