**Data Binding**顧名思義就是數(shù)據(jù)綁定烹困,2015年谷歌I/O大會上發(fā)布了DataBinding嘲更,它是一個數(shù)據(jù)綁定框架上沐,是一種對MVVM的實(shí)現(xiàn)胯努,MVVM模式就相當(dāng)于把 MVC模式中的 C 層換成了VM也就是 ViewModel 層。ViewModel僅僅用來顯示數(shù)據(jù)的坯苹,對于復(fù)雜的數(shù)據(jù)業(yè)務(wù)邏輯不處理隆檀,所以更偏向于View。Data Binding中使用到了ViewModel,它會把ViewModel綁定到 XML文件中恐仑,保證View中的數(shù)值來源都是來自ViewModel泉坐,降低布局和邏輯的耦合性,使代碼邏輯清晰,可以提高開發(fā)效率菊霜,性能高坚冀,功能強(qiáng)大济赎!
**開發(fā)環(huán)境要求**:
Gradle插件至少在1.5.0更高鉴逞,Android studio的版本在1.3.0或更高,可以在Android 2.1(API7+)上使用它。
**基本用途:**
1.去掉了activity司训,fragment中的80%的UI代碼构捡,減少定義View的Id的,不用再去findViewById壳猜,自動綁定好Id 勾徽,不會因?yàn)閕d錯出現(xiàn)crash。
2.XML變成了UI的唯一真實(shí)來源统扳。通過使用Data Binding喘帚,XML中的View數(shù)值來源都是data標(biāo)簽中的變量,數(shù)據(jù)來源比較唯一咒钟。
3.保證執(zhí)行在主線程
**綁定表達(dá)式使用以下運(yùn)算符和關(guān)鍵字:**
1.一元運(yùn)算符:+ 吹由、- 、朱嘴!等
2.二元運(yùn)算符:? &(與) 倾鲫、 | (或)? 、^(異或)
3.移位運(yùn)算符:>> 萍嬉、 >>>? 乌昔、<<
4.比較運(yùn)算符:>= 、 >壤追、? <= 磕道、 <? 、==? ? (請注意行冰,< 需要轉(zhuǎn)義為 <)
5. instanceof? 直接可以看這個實(shí)例是不是某個類的繼承
6.分組運(yùn)算符 ()
7.在文字上支持character溺蕉、String、null资柔、numeric
8.cast(類型轉(zhuǎn)換)
9.方法調(diào)用 (可以用“.”點(diǎn)號焙贷,也可以用兩個"::"冒號來調(diào)方法名)
10.Field訪問(get函數(shù)....)
11.Array訪問,直接在 xml中訪問數(shù)組贿堰,指定下標(biāo)訪問數(shù)組中元素辙芍,但是要注意數(shù)組越界的問題
12.三元運(yùn)算符?:
13空合并運(yùn)算符 (例子? ? 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}" )
**表達(dá)式語法不支持以下操作:**
1.this 不能在xml中訪問this關(guān)鍵字
2.super 不能在xml中調(diào)用父類的方法
3.new 不能在xml中new出實(shí)列
4.不支持顯示泛型調(diào)用<T>
**Include標(biāo)簽**
1.在使用了 app 命名空間的布局中,可以將變量傳遞到include布局的綁定中吃衅,以下示例顯示了將user變量傳遞到name.xml和contact.xml布局文件中(前提是name.xml和contact.xml布局中聲明了user變量):
2.數(shù)據(jù)綁定不支持 include直接作為merge的子元素,根布局必須是ViewGroup往踢,換句話說,外層必須要有LinearLayout徘层、RelativeLayout等像這樣的容器裹著峻呕,才不會出現(xiàn)生成的某些view被覆蓋的問題出現(xiàn)。例如趣效,**不支持以下布局:**
**Observable**是個接口瘦癌,Google為我們提供了一個BaseObservable類,我們只要把Model類繼承自它,就獲得了通知UI更新數(shù)據(jù)的能力了跷敬,然后再getter方法上添加Bindable注解讯私,在setter方法中使用notifying提醒UI更新數(shù)據(jù)。如:
Google也推出ObservableFields類西傀,使用它我們可以簡化我們的Model類斤寇,如:
那一堆代碼就變成了兩行,然后通過:
設(shè)置和獲取數(shù)據(jù),更新UI拥褂。當(dāng)然ObservableField<T>中傳入的泛型可以是java中的基本類型娘锁,當(dāng)然我們還可以使用 ObservableBoolean, ObservableByte, ObservableChar, ObservableShort, ObservableInt, ObservableLong, ObservableFloat, ObservableDouble, ObservableParcelable等具體的類型,效果也和ObservableField<T>是一樣的肿仑,如:
而且Google也為我們提供了一些通知類型的集合致盟,有這三種:ObservableArrayList<T>、ObservableArrayMap<K,V>尤慰、ObservableMap<K,V>馏锡,它和平場使用的List、Map用法一樣伟端,但是多了通知功能杯道。
我們在layout中的<data>區(qū)域?qū)氚缶涂梢灾苯佑盟耍?dāng)它內(nèi)部的數(shù)據(jù)發(fā)生改變時就自動會通知UI界面更新责蝠。如:
**高級綁定党巾,動態(tài)變量**
1.立即綁定。變量或Observable改變后霜医,會在下個幀進(jìn)行綁定的改變齿拂,如果需要立即執(zhí)行,可以執(zhí)行executePendingBindings() 方法肴敛。
2.后臺線程署海。data binding會本地化變量/值域吗购,以避免同步問題(但對collection不行)。
動態(tài)變量多用于RecyclerView砸狞,有時候item布局樣式不是單一的捻勉,存在多種布局,那么就會存在多種ViewHolder 類型刀森。在發(fā)生數(shù)據(jù)綁定的時候踱启,我們并不知道綁定的是哪個layout,ViewHolder的實(shí)例是哪一個研底,這時候就可以在onBindViewHolder函數(shù)里面加入以下類似代碼:
? ? final T item=mltems.get(position); //根據(jù)位置拿到item的數(shù)據(jù)
? ? holder.getBinbgding().setVariable(BR.item,item); //在所有的item的Variable里面都定義同樣的名字叫“item”埠偿,這樣就可以綁定到對應(yīng)的layout了
? ? holder.getBinding().exectePendingBindings(); //因?yàn)镽ecyclerView的view是重用的,所以要立即刷新
**Bingding生成**
1.默認(rèn)生成規(guī)則飘哨,下劃線分割胚想,大寫開頭? 如activity_main.xml? ? ->ActivityMainBinding
2.自定義class, <data class ="LionActive> .......生成的Bingding就是LionActive
最后附上官方的使用教程:https://blog.gokit.info
今天的分享結(jié)束了,再見~