#前言#android
前幾篇已經DataBinding的基礎用法已經介紹的差很少了,因此接下來感覺一下DataBinding強大的高級功能。bash
#正文#app
DataBinding能夠經過註解,實現不少強大的功能,而且十分的方便,可以幫助咱們省去大量的對xml進行操做的代碼,例如加載圖片,字符串處理等等操做。ide
<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中設置ImageView的背景是@{@string/app_name},裏面設置的居然是字符串,若是是正常使用由於屬性類型不匹配,確定是要報錯的,可是利用了@BindingConversion,就能夠幫助咱們實現默認的類型轉換。工具
從功能上看,咱們須要把一個String類型轉換成Drawable類型,因此在任意的工具類中,建立一個以參數爲String類型,返回值爲Drawable類型的方法,最關鍵是的是別忘了@BindingConversion註解,幫助咱們與DataBinding進行綁定,DataBinding會自動在綁定的方法中找到符合要求的方法進行轉換。測試
在定義對象(Bean)中,最多見的就是Setter和Getter方法,DataBinding能夠幫助咱們爲自定義屬性自動設置Setter方法。ui
首先,DataBinding一個不得不說的強大之處,不須要在styleable-declare中聲明就能夠使用他須要的自定義屬性,使用方法和日常的自定義屬性同樣,只須要在root標籤中,定義命名空間。spa
先看代碼:3d
<ImageView
android:layout_width="200dp"
android:layout_height="200dp"
app:imageDrawable="@{@drawable/ic_launcher}"
android:background="@{@string/app_name}"/>
複製代碼
在xml中使用了一個歷來沒見過的imageDrawable屬性,可是不會報錯,運行結果看圖: code
ImageView顯示了@drawable/ic_launcher 對應的圖片,這是爲何呢?
由於DataBinding會自動爲imageDrawable在ImageView中尋找對應的setter方法,也就是setImageDrawable(),若是這個方法不存在確定就要報錯了。其餘的屬性也能夠經過一樣的方式來直接在xml中設置想要的屬性值。
@BindingMethods({ @BindingMethod(type = "android.widget.ImageView", attribute = "android:tint", method = "setImageTintList"), })
ImageView在xml 中的android:tint 屬性 和setImageTintList()是相對應的,可是在方法命名上並非符合Setter的規則,這樣就能夠利用@BindingMethods 來重命名對應的setter方法。
特別注意,這一句須要加載類的最上面,在import 下面。
上面這個例子是系統自帶的,我的感受實戰中可能接觸的並很少。
我的感受這個功能應該是用的最多的,經過@BindingAdapte就能夠直接爲自定義屬性定製本身的實現方法。
<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);
}
複製代碼
首先在工具類中建立一個setter方法,這個方法至少須要一個參數,就是View自己,而後綁定自定義屬性。
上面的loadImage方法,綁定的是image屬性,其中綁定的格式就是 「bind:xxx」, 若是要綁定多個屬性,之間用英文的逗號隔開,例如@BindingAdapter("bind:image" , "bind:test" ),在xml若是須要使用這個方法直接在指定的View設置image屬性。
大部分咱們想在ide中預覽效果,例如看看textView的位置,文字顏色大小等是否滿意,可是使用了DataBinding個就會變得不方便,因此DataBinding直接提供了設置默認值的功能
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName, default=test}"/>
複製代碼
語法就是在完整的屬性值最後用英文的逗號隔開, 加上default=xxxx, 注意這個默認值是不能加上引號的。
特別注意:通過測試,目前DataBinding暫不支持使用@mipmap下的圖片。
#總結#
介紹到這裏,DataBinding的各類功能的使用就算是圓滿的結束了,代碼也很是的簡單,可是必定要本身親自在電腦上敲一敲才能感覺到DataBinding的神奇。
下一篇準備寫一寫還有哪些知識點沒有介紹到,再好好的深化一下概念。