LoginSignup
2
0

More than 5 years have passed since last update.

Gradle Plugin 3.2でデータバインディングがエラーになった

Last updated at Posted at 2018-07-22

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

これでコンパイルが通り、アプリも起動できた。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0