【Android】FragmentのDataBinding

DataBinding使用するとfindViewByIdやsetOnClickListenerを使用せずに データやイベントをセットできます。

TextViewにデータをセットし、クリック処理を行う場合を例にあげます。 なお、DataBindingと関係の無い部分は省略しています。

DataBindingについてはこちらの記事で記述しています。

chocolattips.hatenablog.com

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"

参考