Android DataBinding 快速上手

**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é)束了,再見~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載芽隆,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末统屈,一起剝皮案震驚了整個濱河市胚吁,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌愁憔,老刑警劉巖腕扶,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異吨掌,居然都是意外死亡半抱,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門析砸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沸久,“玉大人见间,你說我怎么就攤上這事∈芳颍” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵肛著,是天一觀的道長圆兵。 經(jīng)常有香客問我,道長枢贿,這世上最難降的妖魔是什么殉农? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮局荚,結(jié)果婚禮上超凳,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好聪建,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布钙畔。 她就那樣靜靜地躺著,像睡著了一般金麸。 火紅的嫁衣襯著肌膚如雪擎析。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天挥下,我揣著相機(jī)與錄音揍魂,去河邊找鬼。 笑死棚瘟,一個胖子當(dāng)著我的面吹牛现斋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播偎蘸,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼庄蹋,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了迷雪?” 一聲冷哼從身側(cè)響起限书,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎章咧,沒想到半個月后倦西,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡赁严,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年扰柠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疼约。...
    茶點(diǎn)故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡卤档,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出忆谓,到底是詐尸還是另有隱情裆装,我是刑警寧澤,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布倡缠,位于F島的核電站哨免,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏昙沦。R本人自食惡果不足惜琢唾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盾饮。 院中可真熱鬧采桃,春花似錦懒熙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至衔蹲,卻和暖如春肢娘,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舆驶。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工橱健, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人沙廉。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓拘荡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親撬陵。 傳聞我的和親對象是個殘疾皇子珊皿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評論 2 348