Android Studio 3.2 Beta4を使い、Gradle Pluginを3.2.0-beta04にしたらデータバインディングがエラーになったのでメモ。
Stable版で修正される可能性があります。
今までの書き方
当該のレイアウトXMLのデータバインディングの書き方は以下だった。
**************.entity.Userは、BaseObservableを継承している。
<variable
name="nav_header_user"
type="**************.entity.User" />
<TextView
android:id="@+id/nav_user_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{nav_header_user.nickname}" />
bindingに対して、Kotlinで設定していた。
val binding = DataBindingUtil.bind<NavHeaderMainBinding>(view)
binding!!.navHeaderUser = user
現象
3.2.0だと、navHeaderUserという名前ではなく、nav_header_userという名前で生成される。
レイアウトXML内のdataのvariableに書いたnameと、生成コードで名前が一致するようになった。
じゃあその名前に変更で直るかというと、今度は生成コード内でまた別のエラーになる。
error: cannot find symbol
this.mNavHeaderUser = NavHeaderUser;
^
symbol: variable mNavHeaderUser
error: cannot find symbol
**************.entity.User navHeaderUser = mNavHeaderUser;
^
symbol: variable mNavHeaderUser
location: class NavHeaderMainBindingImpl
これはデータバインディングで生成されるコードで、ViewDataBindingを継承した ******Binding に存在しないシンボルを******BindingImpl が使用しているようだ。
3.2.0での直し方
存在しないシンボルに合わせ、mNavHeaderUserにリネームすると直る。
<variable
name="mNavHeaderUser"
type="**************.entity.User" />
<TextView
android:id="@+id/nav_user_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@{mNavHeaderUser.nickname}" />
val binding = DataBindingUtil.bind<NavHeaderMainBinding>(view)
binding!!.mNavHeaderUser = user
これでコンパイルが通り、アプリも起動できた。