読者です 読者をやめる 読者になる 読者になる

Androidはワンツーパンチ 三歩進んで二歩下がる

Android卵プログラマーの記録ブログ

DataBindingを使おうとしてバインディングクラスがcannot resolve などとエラーになった時に確認すること

Android

DataBindingを使う時に、プロジェクト生成時に作成したactivity_main.xmlとMainActivity.javaバインディングしようとしただけで
「Cannot resolve symbol 'ActivityMainBinding'」とか言われたはことないでしょうか。
私は2回あるので、初歩的ではありますが簡単にメモっておきます。
本エントリーでは本当に最初の定義の部分の確認のため、データクラスのインスタンスとレイアウトのバインディングのことまで触れておりませんのでよろしくお願いいたします。

developer.android.com

前提事項

public class MainActivity extends AppCompatActivity {

    private ActivityMainBinding binding;   // ← ここがエラーになる

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
    }
}

確認事項

DataBinding設定

appモジュールのbuild.gradleにDataBindingが正しく指定されているか

android {
 中略
    dataBinding {
        enabled = true
    }
 中略
}

レイアウトxml

レイアウトxmlのルートタグがlayoutになっているか

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"/>
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.lastName}"/>
   </LinearLayout>
</layout>

バインディングクラスのクラス名は正しく定義したか

バインディングクラスは、レイアウトxmlの名前のパスカルケース+"Binding"というルールで自動生成されます。
R.layout.activity_main からは ActivityMainBinding というクラスが生成され、
R.layout.fragment_settings からは FragmentSettingsBinding というクラスが生成されます。
自動生成された後ならAndroid Studioで補完が効くのであまり間違わないと思います。

上記を確認した後に「Cannot resolve symbol 'ActivityMainBinding'などとエラーになった場合

Android Studioを起動し直す

これで上手く行ったりするんですよねぇ(;´∀`)

2016/11/18 追記
コメント欄にて id:kimukou_26さんからこのように教えていただきました。
きむこうさんありがとうございます( ´∀`)

再起動しなくてもgradle sync をすれば認識できますよ。
xmlのパースエラーはsys.errに表示されるみたいなので
terminal から
gradlew assembleDebugを行えば
xmlのパースエラーが出た場合には最終行あたりにエラー行が表示されます

きむこうさんがDataBindingの記事を書いていらしてるのでこちらもどうぞ( ´∀`)

exception-think.hatenablog.com