iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 11
0
Mobile Development

Android Architecture Components 學習心得筆記系列 第 11

Day 11 Data Binding (四) BindingAdapter

  • 分享至 

  • xImage
  •  

@BindingAdapter

databinding 用多了會發現幾個問題,因為 UI 元件的屬性都在 xml 定義,變得不像寫在程式碼裡面那樣靈活
屬性沒有對應的 setter,如 ImageView 的 android:src,ImageView 中没有 setSrc() 方法。

這時候就需要客製化自己想要的 setter 。

在任意 class 外面放上自定義的 fun(在 Java 就是 static 的意思)
並加上註解 @BindingAdapter

一個參數

@BindingAdapter("BindingAdapterKey")
fun method(view: View, value: Type) {

    dosomething.....
}

多個參數

@BindingAdapter("BindingAdapterKey1","BindingAdapterKey2","BindingAdapterKey3")
fun method(view: View, value1: Type1, value2: Type2, value3: Type3) {

    dosomething.....
}

(一定要 class 外面,通常是開一個 file 專門放這些 fun)

@BindingAdapter 後面括號內的字串就是對應到 xml 裡面設定屬性的 key
method 的第一個參數都會丟進一個 View (xml 裡的元件都是 View 的子類),就對應到設定這個屬性的 View,後面的 type 就是值。

恩。講得很爛,直接看例子:

@BindingAdapter("imageUrl")
fun bindImage(imageView: ImageView, url: String) {

    Glide.with(imageView.context)
        .load(url)
        .into(imageView)
}

這是一個用 Glide 讀取圖片並設定給 ImageView 的方法
xml:

   <ImageView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:imageUrl="@{viewModel.imageUrl}" />

fun 名稱隨便取都可以,dataBinding 只會依照 "imageUrl" 這個 key 去對應 @BindingAdapter 的 key
接著只要給 viewModel.imageUrl 賦值就可以讀取圖片了。

@BindingConversion

  • 屬性有對應的 setter,但是接受的類型不是自己想要的,
    舉個例子:
    設定 android:background="@{viewModel.color}" 時只接受 drawable 或 color,這時候如果我想要丟
    "#FF5722"之類的字串進去就會報錯。

當 xml 有屬性不匹配的時候,databinding 就會在全部有 @BindingConversion 註解的方法中尋找適合的方法做轉型。

使用:
@BindingAdapter 一樣放在 class 外面。

@BindingConversion
fun convertStringToColorDrawable(color: String): ColorDrawable {
    return ColorDrawable(Color.parseColor(color))
}

這邊是把字串轉型成 ColorDrawable 的方法
xml:

<Button
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:background="@{viewModel.color}" />

接著就可以把字串丟進去給 viewModel.color 裡面了。
viewModel.color = "#FF5722"

使用 @BindingAdapter@BindingConversion 幾乎就可以解決所有客製化 setter 的問題,(因為已經跑回去寫 Java 了)

有任何問題或講得不清楚的地方歡迎留言和我討論。

更歡迎留言糾正我任何說錯的地方!

下一篇:Data Binding (五) Observable


上一篇
Day 10 Data Binding (三) 在 xml 裡的各種語法
下一篇
Day 12 Data Binding (五) Observable
系列文
Android Architecture Components 學習心得筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言