AndroidのDataBindingsで使ったTips

MVVM 設計を採用している Android 案件で、 DataBinding についていろいろ触る機会があったので調べたことなどをメモ

サンプルの全文は GitHub を参照ください。

導入

今現在の Android Studio だと、下記の設定を app の build.gradle に下記を追加するだけで準備としては完了するようです。

基本

Activity や Fragment のレイアウトを DataBinding を使ったものに変えます。

ルート要素を layout に変更しその後に data 要素と view のルート要素を続けます。

view のルート要素は DataBinding を使わなかった場合にルートとなっていた要素です。

こんな感じ。

data 内に、その名の通り variable でこのレイアウトファイルで参照したい変数を宣言します。

変数の内容を参照する時は、上記のように @{ } で囲んで記載します。

そして Activity の onCreate など通常レイアウトファイルを初期化している箇所で下記のように DataBidningUtil を用いる形に変更します。

binding.viewModel = の箇所は、レイアウトファイルで宣言した variable に実体を設定している箇所になります。

このあたりの基本は公式ドキュメントにも割としっかり書いてあるので、そちらも参照ください。

Tips

EditText の内容をコードから参照する

EditText でユーザが入力したテキストをコードの方で取得するには、@={ } という形の構文を使います。

コードの方では、String で受け取っても良いですが、今回は LiveData を使いました。

こうすることで、テキスト入力によって inputText の内容が変化した時に、自動的にこれを参照しているビューの更新も行うことができます。

例えば、他の TextView で @{viewModel.inputText} で参照すると、EditText の入力に合わせて TextView の表示内容も勝手に変わる、ということが実現できます。

整数値をTextViewで表示させる

整数値などを TextView で表示させる時は、String.valueOf で文字列化して渡します。整数値のまま渡すとリソース ID として処理されるようで、android.content.res.Resources$NotFoundException: String resource ID #0x0 のような例外が発生します。

View.VISIBLE,View.INVISIBLE などを使う

visibility を使って View の表示・非表示を切り替えるということをよくやると思いますが、それを DataBinding を用いて行う場合、コードで行うのと同じように View.VISIBLE、View.INVISIBLE などの値を visibility にセットします。

ただし、View.VISIBLE などを使うには最初に xml の方に import文が必要です。

条件分岐

条件分岐は三項演算子のような書き方が使えます。先程の visibility の設定と組み合わせて、入力文字の長さが一定以上なら TextView を表示するというコードであれば以下のようにして実現できます。

Contextを参照する

単に文字列を表示するだけであれば、通常の書き方で android:text="@string/main_input_too_long" などのようにすれば良いのですが、フォーマット付きの文字列などを使いたい場合など。

xml 内で context が参照できるので、それを使います。

例えば、strings.xml でこのような文字列が定義されているとして

レイアウトの方で、context.getString でフォーマット付きの文字列として参照できます。文字列のリソースを参照するので、R を import する必要があります。

Glide、Picasso などでの画像の読み込み

モデルの URL などに合わせて Glide、Picasso などのライブラリを使って画像を読み込むといった場合、BindingAdapter を定義することで実現できます。

まず Kotlin、Java の方で BindingAdapter を定義します。書き方が Kotlin と Java とで違うようですが、ここでは Kotlin での書き方を載せます。

表示する画像の URL の他に、エラー時に表示する画像 fallBackResource を設定できるようにしています。
この画像は Drawable リソースで指定することを想定していますので、BindingAdapter での型も Drawable にしています。

ImageView の方では app:imageUrl として URL 指定できます。fallBackResouce も同様です。

さいごに

DataBinding、書き方が独特な上にエラーメッセージがわかりにくいので、今度同じような案件をやるときのためにメモとして残しておきました。

確認環境

  • Android Studio 3.3.1
  • Zenfone3 Android 7.0

最後まで読んでいただきありがとうございます。 このブログを「いいな」と感じていただけましたら、Twiter にてフォローいただけるとうれしいです。ブログ更新情報などもお届けします。



この記事をシェアする




りゅーた
フリーランスのエンジニアしてます。Android、iOS アプリの開発、対向サーバの開発、C/C++のライブラリ開発が現在のメイン。趣味はテニス。3児の父。 もっと詳しく

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA