這2天正在編輯和整理之前的項目,稍后會把完整的binding例子工程整理好放到github上去。
本系列不是databinding的基礎(chǔ)使用講解,基礎(chǔ)使用看官方文檔就夠了,這里是對于官方提供的所有基礎(chǔ)功能挖掘,怎么樣的能夠利用它簡化開發(fā)工作,發(fā)揮天馬行空的想象力,同時也是拋磚引玉,啟發(fā)大家發(fā)掘出各種用法。
Google官方的Databinding已經(jīng)推出很久了,但是國內(nèi)使用者其實還不多,有很大一部分原因是大家搜索到的教程,其實只是各個功能點最基礎(chǔ)的應(yīng)用,有些同學(xué)淺嘗輒止的看過后會覺得:”其實沒有方便多少嘛“。實際上,這個庫目前來看,絕對不應(yīng)該被看成是一個包裝完全了的傻瓜式使用庫,而應(yīng)該把它看成是一個原材料,它提供給你了無限的可能,你要基于它各種強大的基礎(chǔ)功能,發(fā)揮你的想象力才可能發(fā)現(xiàn)它的好用之處。
本篇介紹的是其中的一個知識點,由淺入深介紹幾個在自己工程實踐中突發(fā)奇想的一些用法。
一. @BindingAdapter 介紹
我們在xml中會給view添加各種屬性,比如 textSize = xxx。databinding庫為我們提供了一種方法,就是擴展view控件的xml屬性,而且使用起來非常簡單,就是在你的項目里寫一個類,然后根據(jù)每一個屬性寫一個方法,使用@BindingAdapter告訴databinding框架這個方法就是用來自定義屬性的。
1。簡單應(yīng)用,view動態(tài)控制:

如上圖,我們寫了一個方法,public static void imageSrc(ImageView view, int resId) 用這個方法來給ImageView控件添加一個xml屬性:imageSrc(通過注解@BindingAdapter來指定這個屬性在xml里應(yīng)該叫什么)。 這樣在xml里我們就可以利用這個屬性來給imageView來添加圖片。
xml中使用方式如下:

我們來看imageView的最后一行,?android:imageSrc="@{menuBean.src()}" 就是我們上面自定義的方法。這個menuBean 是我們在當前xml頁面綁定的一個數(shù)據(jù)對象。這樣一來,我們就可以調(diào)用這個對象的一個方法:src() 來給iageView指定圖片。
如果你要問,這樣做的意義何在?imageView自己就有設(shè)置圖片的方法啊。
我們考慮如下情況,一個imageView,圖片不是固定的,比如根據(jù)用戶級別來顯示不同圖片。這樣一來,我們自定義這個屬性就派上用場了,從服務(wù)端獲取到用戶數(shù)據(jù)后,我們在menuBean內(nèi)部就可以計算判斷出當前應(yīng)該顯示的圖片是什么,并且賦值給這個成員變量。這樣進入頁面的時imageview就會顯示我們想要的圖片。
而我們不在需要代碼中寫mageView的resource控制,而通常要控制一個view,我們都需要在activity都代碼中來寫,這就意味這這段代碼既要引用到view,又要引用到數(shù)據(jù)data對象,不符合代碼低耦合的觀點。而用這種方式以后,data對象里不需要知道view的存在,activity里也不需要去代碼讓這2者關(guān)聯(lián),而是成功的轉(zhuǎn)到了xml中的一條屬性。
src方法如下:

類似的可以有很多場景,比如網(wǎng)絡(luò)圖片的url,文字背景色切換等等。發(fā)揮你的想象力,把代碼中view和data關(guān)聯(lián)的邏輯代碼解放出來把。
2.創(chuàng)造屬性實現(xiàn)多個view之間的觀察者模式
現(xiàn)在大家都開始喜歡響應(yīng)式編程,基于java內(nèi)置都觀察者api,我們平時也可以轉(zhuǎn)變思維來多用響應(yīng)式。
例子:比如一個editText,有需求這個edittext獲取焦點,正在編輯都時候,頁面上其他的一些view要跟著有變化。最直接的做法就是我們在代碼里寫editText的監(jiān)聽事件,然后在找到各個需要處理的view,去代碼控制他們改變。而通常這一戰(zhàn)場又出現(xiàn)在activity里,只有這里才是view 門的聚會場所···。
現(xiàn)在我們改變下思路,不去主動的控制這些view,而讓這些view去響應(yīng)改變,EditText作為obervable被觀察,需要響應(yīng)改變的views作為observer,當觀察到editText在編輯狀態(tài)時,則作出自己的響應(yīng)。
舉例:
(1)自定義類繼承EditText,在獲取焦點時候,像其他的view發(fā)出消息通知。

(2) 自定義響應(yīng)的view 實現(xiàn)Observer接口,文中以textView舉例:update方法會自動響應(yīng)observable對象發(fā)出的消息。

(3)用@BindingAdapter創(chuàng)建方法將二者聯(lián)系起來。

如上,我們可以對這個自定義的EditText擴展一個xml屬性:observer,像其注冊觀察者。這樣我們就可以把2者的鏈接互動通過一條xml屬性就完成,而不需要在去寫任何的代碼:
