no_?thumbnail no_?thumbnail

【Android】View Binding からアクセスしたviewに対してSetOnClickListenerが効かない時の対処法

Android アプリ開発においてよくお世話になっていた findViewById ですが、最近のアップデートでView Binding が実装されたことで、より便利に各種 View にアクセスできるようになりました。

せっかくなのでこれを使うためにリファクタリングをしていたのですが、途中で ViewBinding で拾ってきた view に対して設定したはずのリスナーがうんともすんとも言わなくなったので、その時の解決法、備忘録です。

動かなくなった時のコード

public class FooActivity extends AppCompatActivity {

    private FooActivityBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = FooActivityBinding.inflate(getLayoutInflater());
        setContentView(R.layout.foo_activity);

        binding.button1.setOnClickListener(view -> {
            Log.d("tag", "clicked");
        });
// ...以下省略

普通にonCreate() 内で ViewBinding を初期化して、レイアウト内の button1 に対して setOnClickListener() を設定しています。

解決法

public class FooActivity extends AppCompatActivity {

    private FooActivityBinding binding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = FooActivityBinding.inflate(getLayoutInflater());
        setContentView(binding.getRoot());

        binding.button1.setOnClickListener(view -> {
            Log.d("tag", "clicked");
        });
// ...以下省略

当たり前のように setContentView(R.layout.foo_activity); で表示するコンテンツを呼び出していましたが、ViewBinding に紐付いているレイアウトを指定しないとリスナーを設定した View を参照できないため、getRoot()メソッドを使ってコンテンツを指定します。

……ってことだと思います。私の場合はこれで動きました。