1. ホーム
  2. android

カスタムビューを使ったアンドロイドのデータバインディング

2023-11-05 20:14:27

質問

その Androidデータバインディングガイド ではアクティビティやフラグメント内での値のバインディングについて説明していますが、カスタムビューでデータバインディングを行う方法はあるのでしょうか?

のようなことをしたいのですが。

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <com.mypath.MyCustomView
        android:id="@+id/my_view"
        android:layout_width="match_parent"
        android:layout_height="40dp"/>

</LinearLayout>

my_custom_view.xml :

<layout>

<data>
    <variable
        name="myViewModel"
        type="com.mypath.MyViewModelObject" />
</data>

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@{myViewModel.myText}" />

</LinearLayout>

</layout>

カスタムビューにカスタム属性を設定することでこれを行うことができるように見えますが、バインドする値が多い場合はすぐに面倒になります。

私がやろうとしていることを達成する良い方法はありますか。

どのように解決するのですか?

カスタムビューで、通常の方法でレイアウトを膨らませ、設定したい属性のセッターを提供します。

private MyCustomViewBinding mBinding;
public MyCustomView(...) {
    ...
    LayoutInflater inflater = (LayoutInflater)
        context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    mBinding = MyCustomViewBinding.inflate(inflater);
}

public void setMyViewModel(MyViewModelObject obj) {
    mBinding.setMyViewModel(obj);
}

そして、それを使うレイアウトで

<layout xmlns...>
    <data>
        <variable
            name="myViewModel"
            type="com.mypath.MyViewModelObject" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <com.mypath.MyCustomView
            android:id="@+id/my_view"
            app:myViewModel="@{myViewModel}"
            android:layout_width="match_parent"
            android:layout_height="40dp"/>

    </LinearLayout>
</layout>

上記では、setMyViewModelという名前のセッターがあるため、app:myViewModelに対して自動バインディング属性が作成されます。