KotlinでDataBindingを使ってみたらハマったこと

 

 続き書きました。 KotlinとDataBindingのその後

 

blog.engineer.adways.net


 

こんにちは、梅津です。

ここ1年くらいAndroid界隈ではKotlinが注目を集めていますね。

次のような話を聞いていたら僕もKotlinでアプリを作ってみたくなりました。
Android開発を受注したからKotlinをガッツリ使ってみたら最高だった
Kotlin で Android アプリを 1 本書いてみた感想

ついでにDataBindingを使ったら、きっとJavaで書いていた時とは違うところで躓くんじゃないかと思い、この2つを組み合わせてアプリを作ってみました。
(ちなみにサーバー側は久保田君が作ってくれました。ありがとう!久保田君)
IkaStage

案の定うまくいかないところが出てきたので、ハマったポイントとその解決方法を紹介したいと思います。

ハマったところ その1。 Bindingクラスを参照できない

DataBindingを使う時は "XxxBinding" という名前の自動生成されたクラスを使うことになります。 この自動生成されたBindingクラスですが、Kotlinファイルから参照することができずコンパイルエラーになってしまいました。

どうやらKotlinとJavaのコンパイルする順番が関係してこのようになってしまうようです。

解決方法

この問題はapp/build.gradleを次のように編集することで解決します。

参考リンク


ハマったところ その2。 カスタムセッターがうまく作れない

DataBindingを使っているとカスタムセッターを作りたくなりますよね。

例えば、Glideを使って画像を読み込み、それをImageViewにセットするようなカスタムセッターとか。

Javaでは次のように書けます。

カスタムセッターを作る時は、staticなメソッドを用意する必要があります。

それならとKotlinでstaticなメソッドを作るために、companion objectで括ってメソッドを作ってみました。

ところがこれは

"Cannot find the setter for attribute 'bind:imageUrl' with parameter type java.lang.String. "

と言われてコンパイルエラーになってしまいました。

解決方法

class ではなく object を指定してクラスを作り、メソッドに@JvmStaticを追加することで解決しました。

ちなみに class指定 + companion object + @JvmStatic の組み合わせだと

"DataBindingAttribute.Companion is not static and requires an object to use, retrieved from the DataBindingComponent."

と言われて実行時エラーになりました。

参考リンク


ハマったところ その3。 リネームドセッターの作り方がわからない

リネームドセッターも作るために次のようなJavaファイルをKotlinに変換しましたが、 単純に変換しただけではコンパイルエラーになりました。

変換後

解決方法

これは次のように定義しなおすことで解決できました。

ポイントはこの3点です。

  1. 入れ子になったアノテーションには @ をつけない
  2. typeの引数は クラス名::class の形で渡す
  3. object指定でクラスを作る

最後に

DataBindingをがっつり使ってみたらどうなるか?また、それをKotlinで書いたらどうなるのか?を試してみるためにやってみました。

KotlinはJavaとの強い互換性があるとはいえ、やはり思わぬところで躓くものですね。

今回はJavaからKotlinのクラスを使うにはどうすればいいか?ということを意識させられるアプリ製作となりました。

とはいえ、全てKotlinでもDataBindingが問題なく使えることがわかったので、個人で作るようなアプリは今後もKotlin + DataBindingでやってみようと思います。

お疲れ様でした。