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

プログラミングやどうでもいい話

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

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


2017/04/01追記
id:kimukou_26さんからあらためて教えていただきましたので追記します。きむこうさんありがとうございました!

AS再立ち上げで治る の記載の話ですが、
AS2.2系までの対処法で、そのときはプロジェクトを閉じる時にgradle deamonが終了してくれていました。
(gradle consoleでエラーが出ていない事が前提

AS2.3系では終了されませんので

./gradlew clean
./gradlew cleanBuildCache //InstantRunを使っている時
./gradlew --stop

jpsjavaのプロセスを確認
AS以外のプロセスが居たら kill -9 で殺す

あたりが必要になります

それでも改善されない場合、
あとなぜかIDEのメモリ上に状態を保持しているようなので
AS再起動が有効な場合があり

あとAS再起動よりもInvalidate Restart が良い
という言及もありますが、これは
build.gradle のコンパイル済み中間キャッシュを $HOME/.gradle の下にdeamon実行中に保持しているためなので

build.gradleを書き換えておかしくなった みたいな状況でない場合は
改善策としては微妙な線かと思います