美文网首页JetPack程序员
Android DataBinding 快速上手

Android DataBinding 快速上手

作者: 文质彬_已然未然 | 来源:发表于2020-09-19 00:49 被阅读0次

    **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

    今天的分享结束了,再见~

    相关文章

      网友评论

        本文标题:Android DataBinding 快速上手

        本文链接:https://www.haomeiwen.com/subject/cmvsyktx.html