這2天正在編輯和整理之前的項目脚粟,稍后會把完整的binding例子工程整理好放到github上去趋观。
本系列不是databinding的基礎使用講解,基礎使用看官方文檔就夠了捉片,這里是對于官方提供的所有基礎功能挖掘侈净,怎么樣的能夠利用它簡化開發(fā)工作,發(fā)揮天馬行空的想象力晕鹊,同時也是拋磚引玉岛请,啟發(fā)大家發(fā)掘出各種用法旭寿。
Google官方的Databinding已經(jīng)推出很久了,但是國內(nèi)使用者其實還不多崇败,有很大一部分原因是大家搜索到的教程盅称,其實只是各個功能點最基礎的應用,有些同學淺嘗輒止的看過后會覺得:”其實沒有方便多少嘛“后室。實際上缩膝,這個庫目前來看,絕對不應該被看成是一個包裝完全了的傻瓜式使用庫岸霹,而應該把它看成是一個原材料疾层,它提供給你了無限的可能,你要基于它各種強大的基礎功能贡避,發(fā)揮你的想象力才可能發(fā)現(xiàn)它的好用之處痛黎。
本篇介紹的是其中的一個知識點予弧,由淺入深介紹幾個在自己工程實踐中突發(fā)奇想的一些用法。
一. @BindingAdapter 介紹
我們在xml中會給view添加各種屬性湖饱,比如 textSize = xxx桌肴。databinding庫為我們提供了一種方法,就是擴展view控件的xml屬性琉历,而且使用起來非常簡單,就是在你的項目里寫一個類水醋,然后根據(jù)每一個屬性寫一個方法旗笔,使用@BindingAdapter告訴databinding框架這個方法就是用來自定義屬性的。
1拄踪。簡單應用蝇恶,view動態(tài)控制:
如上圖,我們寫了一個方法惶桐,public static void imageSrc(ImageView view, int resId) 用這個方法來給ImageView控件添加一個xml屬性:imageSrc(通過注解@BindingAdapter來指定這個屬性在xml里應該叫什么)撮弧。 這樣在xml里我們就可以利用這個屬性來給imageView來添加圖片。
xml中使用方式如下:
我們來看imageView的最后一行姚糊,?android:imageSrc="@{menuBean.src()}" 就是我們上面自定義的方法贿衍。這個menuBean 是我們在當前xml頁面綁定的一個數(shù)據(jù)對象。這樣一來救恨,我們就可以調(diào)用這個對象的一個方法:src() 來給iageView指定圖片贸辈。
如果你要問,這樣做的意義何在肠槽?imageView自己就有設置圖片的方法啊擎淤。
我們考慮如下情況,一個imageView秸仙,圖片不是固定的嘴拢,比如根據(jù)用戶級別來顯示不同圖片。這樣一來寂纪,我們自定義這個屬性就派上用場了席吴,從服務端獲取到用戶數(shù)據(jù)后,我們在menuBean內(nèi)部就可以計算判斷出當前應該顯示的圖片是什么弊攘,并且賦值給這個成員變量抢腐。這樣進入頁面的時imageview就會顯示我們想要的圖片。
而我們不在需要代碼中寫mageView的resource控制襟交,而通常要控制一個view迈倍,我們都需要在activity都代碼中來寫,這就意味這這段代碼既要引用到view捣域,又要引用到數(shù)據(jù)data對象啼染,不符合代碼低耦合的觀點宴合。而用這種方式以后,data對象里不需要知道view的存在迹鹅,activity里也不需要去代碼讓這2者關(guān)聯(lián)卦洽,而是成功的轉(zhuǎn)到了xml中的一條屬性。
src方法如下:
類似的可以有很多場景斜棚,比如網(wǎng)絡圖片的url阀蒂,文字背景色切換等等。發(fā)揮你的想象力弟蚀,把代碼中view和data關(guān)聯(lián)的邏輯代碼解放出來把蚤霞。
2.創(chuàng)造屬性實現(xiàn)多個view之間的觀察者模式
現(xiàn)在大家都開始喜歡響應式編程,基于java內(nèi)置都觀察者api义钉,我們平時也可以轉(zhuǎn)變思維來多用響應式昧绣。
例子:比如一個editText,有需求這個edittext獲取焦點捶闸,正在編輯都時候夜畴,頁面上其他的一些view要跟著有變化。最直接的做法就是我們在代碼里寫editText的監(jiān)聽事件删壮,然后在找到各個需要處理的view贪绘,去代碼控制他們改變。而通常這一戰(zhàn)場又出現(xiàn)在activity里醉锅,只有這里才是view 門的聚會場所···兔簇。
現(xiàn)在我們改變下思路,不去主動的控制這些view硬耍,而讓這些view去響應改變垄琐,EditText作為obervable被觀察,需要響應改變的views作為observer经柴,當觀察到editText在編輯狀態(tài)時狸窘,則作出自己的響應。
舉例:
(1)自定義類繼承EditText坯认,在獲取焦點時候翻擒,像其他的view發(fā)出消息通知。
(2) 自定義響應的view 實現(xiàn)Observer接口牛哺,文中以textView舉例:update方法會自動響應observable對象發(fā)出的消息陋气。
(3)用@BindingAdapter創(chuàng)建方法將二者聯(lián)系起來。