前言#
前幾篇已經(jīng)DataBinding的基礎(chǔ)用法已經(jīng)介紹的差不多了链方,所以接下來(lái)感受一下DataBinding強(qiáng)大的高級(jí)功能逾一。
正文#
DataBinding可以通過(guò)注解侦铜,實(shí)現(xiàn)很多強(qiáng)大的功能先鱼,并且十分的方便辟躏,能夠幫助我們省去大量的對(duì)xml進(jìn)行操作的代碼,例如加載圖片驯遇,字符串處理等等操作芹彬。
<h2>@BindingConversion 自定義類型轉(zhuǎn)換</h2>
<ImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@{@string/app_name}"/>
@BindingConversion
public static Drawable convertStringToDrawable(String str){
return new ColorDrawable(Color.parseColor("#344567"));
}
分析上面的代碼,在xml中設(shè)置ImageView的背景是@{@string/app_name}叉庐,里面設(shè)置的竟然是字符串舒帮,如果是正常使用因?yàn)閷傩灶愋筒黄ヅ洌隙ㄊ且獔?bào)錯(cuò)的陡叠,但是利用了@BindingConversion玩郊,就可以幫助我們實(shí)現(xiàn)默認(rèn)的類型轉(zhuǎn)換。
從功能上看枉阵,我們需要把一個(gè)String類型轉(zhuǎn)換成Drawable類型译红,所以在任意的工具類中,創(chuàng)建一個(gè)以參數(shù)為String類型兴溜,返回值為Drawable類型的方法侦厚,最關(guān)鍵是的是別忘了@BindingConversion注解,幫助我們與DataBinding進(jìn)行綁定拙徽,DataBinding會(huì)自動(dòng)在綁定的方法中找到符合要求的方法進(jìn)行轉(zhuǎn)換刨沦。
<h2>自動(dòng)添加Setter方法</h2>
在定義對(duì)象(Bean)中,最常見的就是Setter和Getter方法膘怕,DataBinding可以幫助我們?yōu)樽远x屬性自動(dòng)設(shè)置Setter方法想诅。
首先,DataBinding一個(gè)不得不說(shuō)的強(qiáng)大之處淳蔼,不需要在styleable-declare中聲明就可以使用他需要的自定義屬性侧蘸,使用方法和平常的自定義屬性一樣,只需要在root標(biāo)簽中鹉梨,定義命名空間讳癌。
先看代碼:
<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
app:imageDrawable="@{@drawable/ic_launcher}"
android:background="@{@string/app_name}"/>
在xml中使用了一個(gè)從來(lái)沒見過(guò)的imageDrawable屬性,但是不會(huì)報(bào)錯(cuò)存皂,運(yùn)行結(jié)果看圖:
ImageView顯示了@drawable/ic_launcher 對(duì)應(yīng)的圖片晌坤,這是為什么呢?
因?yàn)镈ataBinding會(huì)自動(dòng)為imageDrawable在ImageView中尋找對(duì)應(yīng)的setter方法旦袋,也就是setImageDrawable()骤菠,如果這個(gè)方法不存在肯定就要報(bào)錯(cuò)了。其他的屬性也可以通過(guò)同樣的方式來(lái)直接在xml中設(shè)置想要的屬性值疤孕。
<h2>重命名setter 方法 @BindingMethods</h2>
@BindingMethods({
@BindingMethod(type = "android.widget.ImageView",
attribute = "android:tint",
method = "setImageTintList"),
})
ImageView在xml 中的android:tint 屬性 和setImageTintList()是相對(duì)應(yīng)的商乎,但是在方法命名上并不是符合Setter的規(guī)則,這樣就可以利用@BindingMethods 來(lái)重命名對(duì)應(yīng)的setter方法祭阀。
特別注意鹉戚,這一句需要加載類的最上面鲜戒,在import 下面。
上面這個(gè)例子是系統(tǒng)自帶的抹凳,個(gè)人感覺實(shí)戰(zhàn)中可能接觸的并不多遏餐。
<h2>自定義setter方法@BindingAdapte</h2>
個(gè)人感覺這個(gè)功能應(yīng)該是用的最多的,通過(guò)@BindingAdapte就可以直接為自定義屬性定制自己的實(shí)現(xiàn)方法赢底。
<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
app:image="@{@drawable/ic_launcher}"
android:background="@{@string/app_name}"/>
@BindingAdapter("bind:image")
public static void loadImage(ImageView image, Drawable resId){
image.setImageDrawable(resId);
}
首先在工具類中創(chuàng)建一個(gè)setter方法失都,這個(gè)方法至少需要一個(gè)參數(shù),就是View本身幸冻,然后綁定自定義屬性粹庞。
上面的loadImage方法,綁定的是image屬性嘁扼,其中綁定的格式就是 “bind:xxx”, 如果要綁定多個(gè)屬性信粮,之間用英文的逗號(hào)隔開,例如@BindingAdapter("bind:image" , "bind:test" )趁啸,在xml如果需要使用這個(gè)方法直接在指定的View設(shè)置image屬性强缘。
<h2>設(shè)置View上屬性默認(rèn)值</h2>
大部分我們想在ide中預(yù)覽效果,例如看看textView的位置不傅,文字顏色大小等是否滿意旅掂,但是使用了DataBinding個(gè)就會(huì)變得不方便,所以DataBinding直接提供了設(shè)置默認(rèn)值的功能
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName, default=test}"/>
語(yǔ)法就是在完整的屬性值最后用英文的逗號(hào)隔開访娶, 加上default=xxxx, 注意這個(gè)默認(rèn)值是不能加上引號(hào)的商虐。
特別注意:經(jīng)過(guò)測(cè)試,目前DataBinding暫不支持使用@mipmap下的圖片崖疤。
總結(jié)#
介紹到這里秘车,DataBinding的各種功能的使用就算是圓滿的結(jié)束了,代碼也非常的簡(jiǎn)單劫哼,但是一定要自己親自在電腦上敲一敲才能感受到DataBinding的神奇叮趴。
下一篇準(zhǔn)備寫一寫還有哪些知識(shí)點(diǎn)沒有介紹到,再好好的深化一下概念权烧。