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
賦值就可以讀取圖片了。
android:background="@{viewModel.color}"
時只接受 drawable 或 color,這時候如果我想要丟當 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