読者です 読者をやめる 読者になる 読者になる

KotlinのExtensionでDataBindingのBindingAdapterを使う。

本記事では DataBinding の方法については省略します。
DataBinding の方法については以下の記事を参照下さい。

BindingAdapterとは?

カスタムセッターを定義するものです。
BindingAdapterアノテーションを付けた関数を定義すると、その関数をレイアウトのxmlから参照できます。 Javaでの関数の定義は以下のとおりです。

@BindingAdapter("android:paddingLeft")
public static void setPaddingLeft(View view, int padding) {
   view.setPadding(padding,
                   view.getPaddingTop(),
                   view.getPaddingRight(),
                   view.getPaddingBottom());
}

xml側での呼び出しは以下のとおりです。

    <TextView
        android:layout_width="wrap_content"  
        android:layout_height="wrap_content"
        android:id="@+id/firstNameTextView"
        android:paddingLeft="@{1000}"
        />

android:paddingLeft="1000" ではなく android:paddingLeft="@{1000}" と設定する点に注意してください。

参考にしたページ

KotlinでのBindingAdapterを定義する。

※オススメしない方法ですが検索するとこの方法がヒットするので記載します。
Kotlin で Jave のような staticメソッドを作るには companion object を使うようですが、BindingAdapter で companion object を使うとエラーになります。
そこで以下の通りobject指定でクラスを作り、実装します。

object CustomBindingAdapter {
    @BindingAdapter("android:paddingLeft")
    @JvmStatic
    fun setPaddingLeft(view: View, padding: Int) {
        view.setPadding(padding,
                view.paddingTop,
                view.paddingRight,
                view.paddingBottom)
    }
}

xml側の変更はありません。

参考にしたページ

KotlinのExtensionsを使う。

上記の通りで実装できますが、Kotlin で BindingAdapter を使う場合は、Extension を使えばいいよね。という投稿をいくつか見ました。

Extension を使った実装は以下のとおりです。

@BindingAdapter("android:paddingLeft")
fun View.setPaddingLeft(padding: Int) {
    this.setPadding(padding,
            this.paddingTop,
            this.paddingRight,
            this.paddingBottom)

}

こちらの方が余計な object 宣言のなく簡潔に実装できます。

なぜこれで動くのか?

Kotlin の Extension は Java の staticメソッドに展開されます。
展開されたコードが最初に紹介した Java での関数定義と同じになるため、 Kotlin の Extension で BindingAdapter を定義できます。

参考にしたページ