【Android】DataBindingの使い方

DataBindingを使用すると、findViewByIdやsetOnClickListener、setTextなどを使用せずに データの表示やイベントの設定といったことができます。

DataBindingはActivity, Fragment, CustomView, RecyclerViewといったViewをinflateするようなところに使えます。

実装の流れ

  1. build.gradleに追加
  2. レイアウトに追加
  3. data, variableの追加
    • データの表示
    • Viewの取得
    • メソッドの実行
    • 双方向のデータ
  4. DataBindingUtilに変更

なお、直接関係のない部分は省略しています。

build.gradleに追加

android {
    ...
    dataBinding{
        enabled = true
    }
}

レイアウトに追加

DataBindingなし

<LinearLayout>
//...
</LinearLayout>

DataBindingあり

全体を<layout>で囲みます。

<layout>
    <LinearLayout>
    //...
    </LinearLayout>
</layout>

data, variableの追加

データの表示

以下のようなデータを例にします。

public class HelloData{
    public String title;
    public int number;
}

レイアウトに<data><variable>を追加します。

<layout>
    <data>
        <variable name="data" type="com.example.HelloData" />
    </data>
    
    <LinearLayout>
    //...
    </LinearLayout>
</layout>

使用する場合は@{}に記述します。

<TextView android:text="@{data.title}" />

TextViewに表示する場合、TextView#setTextではResourceIdとして扱われるため intのデータを表示する場合はStringに変換する必要があります。

<TextView android:text="@{Integer.toString(data.number)}" />

文字列の連結でもできます。

<TextView android:text="@{`` + data.number}" />

Viewの取得

layoutでViewにidを設定すると、

<TextView android:id="@+id/text_view" />

idのキャメルケースでViewを取得できます。

TextView textView = binding.textView;

メソッドの実行

以下のようなクラスを例にします。

public class HelloCallback{
    public void onHello();
    public void onHello(HelloData data);
    public void onHello(View view);
}

先ほどと同じように<variable>を追加すると、

<layout>
    <data>
        <variable name="callback" type="com.example.HelloCallback" />
        <variable name="data" type="com.example.HelloData" />
    </data>
    
    <LinearLayout>
    //...
    </LinearLayout>
</layout>

ラムダ式でclassのメソッドを実行できます。

<TextView android:onClick="@{() -> callback.onHello()}" />

イベント(この場合はvoid onClick(View view))とパラメータの型を合わせるとListenerを設定でき、

<TextView android:onClick="@{callback.onHello}" />

Listenerの代わりにラムダ式でonClickのviewを渡すことも可能で、

<TextView android:onClick="@{(view) -> callback.onHello(view)}" />

加えて、<variable>を渡すこともできます。

<TextView android:onClick="@{() -> callback.onHello(data)}" />

双方向のデータ

ObservableFieldを使用することでEditTextで入力した内容がクラスのFieldに反映されます。

public class ObservableHelloData{
    public ObservableField<String> title;

    public ObservableData(HelloData data){
        title = new ObservableField<>(data.title);
    }
}

データのクラスを変更します。

<layout>
    <data>
        <variable name="data" type="com.example.ObservableHelloData" />
    </data>
    
    <LinearLayout>
    //...
    </LinearLayout>
</layout>

双方向の場合は@{の間に=を入れます。

<EditText android:text="@={data.title} />

DataBindingUtilに変更

Activity#setContentViewLayoutInflater#inflateといった部分を DataBindingUtil#setContentViewDataBindingUtil#inflateに変更します。

以下でDataBindingを使用した例を記載しています。

chocolattips.hatenablog.com chocolattips.hatenablog.com

参考