〈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)