【Android】DataBindingの使い方
DataBindingを使用すると、findViewByIdやsetOnClickListener、setTextなどを使用せずに データの表示やイベントの設定といったことができます。
DataBindingはActivity, Fragment, CustomView, RecyclerViewといったViewをinflateするようなところに使えます。
実装の流れ
- build.gradleに追加
- レイアウトに追加
- data, variableの追加
- データの表示
- Viewの取得
- メソッドの実行
- 双方向のデータ
- 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#setContentView
やLayoutInflater#inflate
といった部分を
DataBindingUtil#setContentView
やDataBindingUtil#inflate
に変更します。
以下でDataBindingを使用した例を記載しています。
chocolattips.hatenablog.com chocolattips.hatenablog.com