Androidの実装でDetaBindingを導入しようとした際の試行錯誤の備忘録。
些細なミスでした。
TL;DR
- module側でDataBindingする時でも、module/build.gradleだけではなく、app/build.gradleにも
dataBinding.enabled=true
の記載は必要 -
公式ドキュメントをよく読もう
データ バインディングを使うライブラリに依存するアプリ モジュールがある場合は、そのアプリの build.gradle 内でもデータ バイディングの設定をする必要があります。
環境
- Android Studio 3.1.3
構成
- app(アプリモジュール)
- moduel(ライブラリモジュール)
事の成り行き
1. DataBindingを実装してみる
DataBindingが使って見たかったのでググると、build.gradleにdataBinding.enabled=true
を追加すれば良いとある。
実装するのはmodule側なので、module/build.gradle
にその通りに追加。
android{
...
dataBinding {
enabled = true
}
}
Sync Gradle
も問題なく完了したので意気揚々とDataBindingを実装して、エミュレーター上で走らせてみる。
2. NoClassDefFoundErrorエラー
エミュレーター上で問題なくアプリが立ち上がったので「よっしゃ行けた!」とDataBindingを実装したページを開くとアプリが落ちた。
エラーログを確認すると
java.lang.NoClassDefFoundError: Failed resolution of: Landroid/databinding/DataBinderMapper;
と出ている。なんでや。
3. ググって色々やってみる
同じ症状が出ている人の質問に対する回答に「build.gradle
の依存関係にcom.android.databinding:compiler:3.0.1
突っ込めば行けたよ」ってあったので、下記のように突っ込んでみる。
dependencies {
compileOnly 'com.android.databinding:compiler:3.1.3'
annotationProcessor 'com.android.databinding:compiler:3.0.1'
}
駄目でした。
その後も調べては試しを繰り返して時間を浪費。
4. 公式ドキュメントを読む
この辺りでようやく「公式ではなんて書いてあるんだろう」と思い至り、読んでみる。
データ バインディングを使うライブラリに依存するアプリ モジュールがある場合は、そのアプリの build.gradle 内でもデータ バイディングの設定をする必要があります。
はい。
素直に従って、app/build.gradle
にも同様にbuild.gradleにdataBinding.enabled=true
を記載。
android{
...
dataBinding {
enabled = true
}
}
android{
...
dataBinding {
enabled = true
}
}
アプリを走らせて該当ページを開く。行けた。
まとめ
公式ドキュメントは偉大である。