〈kotlin〉BindingAdapter(DataBinding)

Android studioでkotlinを使ってAndroidアプリ作成の勉強中。

DataBindingで渡された値にオリジナルの処理を追加することができる、
BindingAdapterについてまとめる。

DataBindingはこれ。
〈kotlin〉Android studio実践メモ2:MVVM(DataBinding) - ゆるプログラミング日記

BindingAdapterの定義

ObjectとしてBindingAdapterを用意する(オブジェクト名は何でも良い)。
そこに@BindingAdapterのアノテーションをつけた関数を定義し、
DataBindingで得られた値を使った追加処理を記載する。

@BindingAdapter("imageUrl")
@JvmStatic
//Javaからも呼び出せるようにするためのアノテーション
fun loadImage(view: ImageView, url: String) {
    Picasso.get().load(url).into(view)
}

アノテーションの引数にはオリジナルの属性を定義する。
ここに書いた属性名をxmlファイル内に後ほど埋め込む。
関数の第一引数は属性に関連付けられているビューの型を指定、
第二引数はバインディング式で受け取る値を指定する。

複数の属性を受け取るアダプターを設定することもできる。

@BindingAdapter("imageUrl", "error")
@JvmStatic
fun loadImage(view: ImageView, url: String, error: Drawable) {
    Picasso.get().load(url).error(error).into(view)
}

バインディング

xml側には、アダプターに定義した属性名を使ってバインディング式を記述する。

<ImageView 
    ...
    app:imageUrl="@{model.imageUrl}" 
    app:error="@{@drawable/venueError}"
                       //アプリ内のリソースを参照
 />

この場合imageUrl属性にString型、error属性にDrawable型の値が得られたとき、
BindingAdapterとして定義したloadImage()が呼び出される。
属性のどちらかが設定されるだけで呼び出したい場合には、
adapterのrequireAllフラグをfalseにしておく。

@BindingAdapter(value = ["imageUrl", "placeholder"], requireAll = false)


参考
バインディング アダプター  |  Android デベロッパー  |  Android Developers