読者です 読者をやめる 読者になる 読者になる

Android Data Bindingを使ってみる

Pythonでバックエンド書いたり、JavaScriptでフロント書いたり、C++アルゴリズム実装したりしてたけど、スマホアプリ書くかーと思ってとりあえずAndroidを触ってみることにした。

 

Androidのシステム考えるとMVCよりMVVMだよなーとか考えつつ、最近出たらしいAndroidのData Bindingを使ってみる。

 

公式のやり方はここに書いてあるが、自分自身Androidについてよくわかってないのか試行錯誤しながら動かしたのでメモ。

 

環境:Android Studio1.5.1

開発環境を以前まとめて入れた時にAndroidStudioも入れていたが、バージョンが1.3.xと古かったのでとりあえずバージョンアップした。

開発環境がが古くとも特にいいことは無いのでバージョンは上げておこう(だだし破壊的変更がある場合は除く)

 

1.build.gradleに追記する

Android Studio1.3.xを使っている人は他にも追記する場所があるみたいだがここは1.5.1前提で話をすすめる。

1.5.1の場合、すでにDataBindingライブラリは入っているので、build.gradleにそれを有効化する記述を追記する。

gist.github.com

 

 2.Viewにバインディングするtext等を指定する。

次はバインディングするテキストなどを指定する。

View(layout)を適当に作ったあと、まずはルートノードとして<layout>タグを追加する。

テンプレートのままだとルートノードは<RelativeLayout>だから、それをくくる形にする。

gist.github.com

そして、<layout>直下に<data>ノードを追加。

このノードにはバインディングするときに使うオブジェクト(下で記述する)と階層を指定するvariableというノードを記述する。

ここでは、公式ガイドと同じくオブジェクトはUserとする。

gist.github.com

nameはこのxml上で使用するオブジェクトへの変数みたいなもの。

typeはオブジェクトまでの階層を記述するのだが、公式ガイドではユーザー名とアプリ名の部分が省略されているので注意すること。

 あとは、データをバインディングさせたい位置に@"{user.hoge}"のような形式で記述する。

具体的な使用例は公式ガイドのWriting your first data binding expressionsセクションの使用例のところを見て欲しい。

 

3.バインディング用のクラスの作成

次は、バインディング用のクラスを作成する。

これはぶっちゃけガイドのData Objectセクションのコードを見てもらったほうが早いと思う。

コード量が少ないのはPOJOのコードだが、メンバ変数が直接触れてしまうので、下のJavaBeans形式のほうがいいと思う。

2のtypeの書き方だとプロジェクト生成直後のMainActivityと同階層にUserクラスを置くことになるので、階層を作っている人は適宜脳内で置き換えて欲しい。

 

4.gradleでプロジェクトをsyncする

これはたぶんガイドには載っていないが、2で追記したdataノードからクラスを生成する必要がある。

生成しないと、実際にバインディングする時バインディング用のクラスが無いと言われ、ビルドに失敗する。

と言ってもやることは簡単で、単にSync Project With Gradle Filesボタンをクリックするだけ。

エラーが吐かれなければ、バインディングに必要なクラスが生成されているはず。

 

5.バインディングしてみる。

これもガイドのBinding Dataセクションのコードを見てもらったほうが早い。

4行目で2で追記したDataノードがあるxmlバインディングできるようにしてbindingに代入する。

MainActivityBindingという型だが、これが4で生成したクラスの正体。

syncしていなかったり、エラーを吐いていたりすると型の解決に失敗する。

この型は上でも書いたとおりgradleによって生成されるが、命名規則がある。

layout名がmain_activityの場合、スネークケースをアッパーキャメルケースに変更(MainActivity)し、後ろにBindingを付ける(MainActivityBinding)。

5行目では、最初にバインディングするテキストをコンストラクタに渡し、Userオブジェクトを生成し、6行目でバインディングを開始している。

 

そもそもがJavaにあまり慣れていない為用語に間違いがあると思うが、なんとなく察して欲しい。

 

GUIアプリケーションでリアルタイム更新をするとき、get系のメソッドをいちいち叩くのは面倒とかいうレベルでは無いので積極的にMVVMを使っていきたい。