【Android】FragmentのDataBinding
DataBinding使用するとfindViewByIdやsetOnClickListenerを使用せずに データやイベントをセットできます。
TextViewにデータをセットし、クリック処理を行う場合を例にあげます。 なお、DataBindingと関係の無い部分は省略しています。
DataBindingについてはこちらの記事で記述しています。
DataBindingなし
<LinearLayout> <TextView android:id="@+id/text_view" /> </LinearLayout>
public class HelloFragment extends Fragment{ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { ViewGroup root = (ViewGroup)inflater.inflate(R.layout.fragment_hello, container, false); UserData user = new UserData(); TextView textView = (TextView)root.findViewById(R.id.text_view); textView.setText(user.name); textView.setOnClickListener(new OnClickListener(){ @Override public void onClick(View view) { //Click処理 } }); return root; } public class UserData{ public String name = "Hello User"; } }
DataBindingあり
<layout> <data> <variable name="presenter" type="com.example.Presenter" /> <variable name="user" type="com.example.UserData" /> </data> <LinearLayout> <TextView android:text"@{user.name}" android:onClick="@{() -> presenter.onClick()}" /> </LinearLayout> </layout>
public class HelloFragment extends Fragment{ public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { FragmentHelloBinding binding = DataBindingUtil.inflate(inflater, R.layout.fragment_hello, container, false); View root = binding.getRoot(); binding.setPresenter(new Presenter()); binding.setUser(new UserData()); return root; } public class Presenter{ public void onClick(){ //Click処理 } } public class UserData{ public String name = "Hello User"; } }
実装の流れ
- build.gradleに追加
- Fragmentのlayoutに追加
- Fragmentのコードを変更
build.gradleに追加
android{ ... databinding{ enable = true } }
Fragmentのlayoutに追加
Fragmentのlayoutのxmlを<layout>
で囲み、<data>
内にDataBindingで使用するクラスを
<variable>
で指定します。<variable>
はnameで変数名、typeでpackageを含めたクラス名を記述します。
<data> <variable name="presenter" type="com.example.Presenter" /> <variable name="user" type="com.example.UserData" /> </data>
変数は"@{…}“に記述します。
android:text="@{user.name}"
android:onClick="@{() -> presenter.onClick()}"
Viewを引数で受け取ることもできます。
android:onClick="@{(view) -> presenter.onClick(view)}"
public class Presenter{ public void onClick(View view){ //Click処理 } }
Fragmentのコードを変更
inflater.inflateをDataBindingUtil.inflateに変更します。 inflateの型はlayoutのファイル名がfragment_hello.xmlの場合、FragmentHelloBindingになります。
FragmentHelloBinding binding = DataBindingUtil.inflate(inflater, R.layout.fragment_hello, container, false);
また、<variable>
のnameで指定した変数名のsetterが作られ、そこに変数を渡します。
binding.setPresenter(new Presenter()); //name="presenter" binding.setUser(new UserData()); //name="user"