DataBind浅析

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以上。

图1


图2

他的布局文件与我们平时的布局文件稍有不同,图2是一个使用了DataBinding的布局文件,变量user作为被绑定的数据,在<data/><variable/>标签下边需要被描述。<variable/>的数量没有上限,他的类型在编译的时候被检查。


图3

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作为合并元素的直接子元素。


图4

数据类型的对象无论是使用构造方法传入,还是JavaBean的方式,对于数据绑定的角度来看都是等价的。

这里图3的TextView的android:text属性的@{user.lastName}表达式将访问getLastName()方法。



图5

AS会根据layout文件自动生成一个默认的Binding类,类名是根据layout文件名生成的,后缀以“Binding”结束(当然如果不喜欢这个生成的名字也可以更改),<data class="自定义的名称">...</data>标签下自定义名称。

使用DataBinding方式的布局文件后,要用DataBindUtil.setContentView来代替setContentView。

2.2事件绑定

Databinding事件绑定,分两种方式:方法引用和监听绑定。

区别主要在于方法引用实际的监听器实现是在绑定数据的时候创建的,而不是在事件触发的时候创建的。

2.2.1方法引用

事件可以直接绑定到处理方法,类似于android:onClick。

图6

绑定的值是要调用的方法的名称。如图6所示。

图7


图8

2.2.2监听绑定

监听器绑定是在事件发生时候运行的绑定表达式,支持lambda表达式。

当事件触发的时候,数据绑定将计算给定的表达式,

需要注意的是:此功能在 Android Gradle Plugin version 2.0 或更新版本上可用;

图9


图10

表达式返回值的类型必须与监听事件的返回值类型相同。

如果由于null对象无法计算此表达式,数据绑定将返回该类型的默认Java值。例如,引用类型返回null,int类型返回0,boolean类型返回false;

图11

2.2.3双向绑定

图12

 在属性绑定的时候使用@=的方式来双向绑定,使用了双向绑定,在EditText中输入内容,就会自动存储到对应的字段上,如果还有其它View单向绑定了这个值,它的显示也会发生变化。

3.在Fragment,自定义View中的使用

fragment中没有setContent方法,所以实例化databinding的方式不一样,

图13

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


图14

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错误。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容