DataBinding 學習系列(4)DataBinding的高級功能

#前言#android

前幾篇已經DataBinding的基礎用法已經介紹的差很少了,因此接下來感覺一下DataBinding強大的高級功能。bash

#正文#app

DataBinding能夠經過註解,實現不少強大的功能,而且十分的方便,可以幫助咱們省去大量的對xml進行操做的代碼,例如加載圖片,字符串處理等等操做。ide

@BindingConversion 自定義類型轉換

<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會自動在綁定的方法中找到符合要求的方法進行轉換。測試

自動添加Setter方法

在定義對象(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中設置想要的屬性值。

重命名setter 方法 @BindingMethods

@BindingMethods({ @BindingMethod(type = "android.widget.ImageView", attribute = "android:tint", method = "setImageTintList"), })

ImageView在xml 中的android:tint 屬性 和setImageTintList()是相對應的,可是在方法命名上並非符合Setter的規則,這樣就能夠利用@BindingMethods 來重命名對應的setter方法。

特別注意,這一句須要加載類的最上面,在import 下面。

上面這個例子是系統自帶的,我的感受實戰中可能接觸的並很少。

自定義setter方法@BindingAdapte

我的感受這個功能應該是用的最多的,經過@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屬性。

設置View上屬性默認值

大部分咱們想在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的神奇。

下一篇準備寫一寫還有哪些知識點沒有介紹到,再好好的深化一下概念。

相關文章
相關標籤/搜索