DataBindingを使おうとしてバインディングクラスがcannot resolve などとエラーになった時に確認すること
DataBindingを使う時に、プロジェクト生成時に作成したactivity_main.xmlとMainActivity.javaをバインディングしようとしただけで
「Cannot resolve symbol 'ActivityMainBinding'」とか言われたはことないでしょうか。
私は2回あるので、初歩的ではありますが簡単にメモっておきます。
本エントリーでは本当に最初の定義の部分の確認のため、データクラスのインスタンスとレイアウトのバインディングのことまで触れておりませんのでよろしくお願いいたします。
前提事項
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 --stopjpsでjavaのプロセスを確認
AS以外のプロセスが居たら kill -9 で殺すあたりが必要になります
それでも改善されない場合、
あとなぜかIDEのメモリ上に状態を保持しているようなので
AS再起動が有効な場合がありあとAS再起動よりもInvalidate Restart が良い
という言及もありますが、これは
build.gradle のコンパイル済み中間キャッシュを $HOME/.gradle の下にdeamon実行中に保持しているためなのでbuild.gradleを書き換えておかしくなった みたいな状況でない場合は
改善策としては微妙な線かと思います