らこらこブログ

唐揚げとアニメとプログラミングが大好きです

android-bindingでMVVMなAndroidアプリ開発 その1

というわけでAndroid用のMVVM開発用ライブラリ android-binding(以下AB)についてこれから使い方を解説していこうと思います
と言っても私も使い始めたのはつい2週間くらい前で、手探りで動作を確かめながらの勉強の結果なので間違ってたりしたら大目に見てください
とりあえず初回は概念的なものから基礎まで。

まずMVVMとはというところですがこれは私より皆さんのほうがよくわかってそうですが、"Model"-"View"-"ViewModel"からなるアーキテクチャパターンですね。真っ先に思い浮かぶのはWPFでしょうか。
Androidにおいては"View"≒レイアウトxml です。ですがxmlWPFxamlと違いコードビハインドされていませんので、実体を持ちません。言うなれば型紙です。
"View"の実体を持つのはActivityです。Android的に言うならxmlを"View"にInflate(ふくらませる)する役割を持っています。
以上のことからABでは基本としてAcitivityを"View"として扱います。

とまぁ実際使う上でなんの参考にもならない部分を話したところで、とりあえず環境構築しましょう。
eclipse前提で話します。またAndroidSDKやらの部分は端折ります。できてください。
とりあえずはサンプル用に一つプロジェクトを作ります。今回は"BindingSample"というプロジェクトにして、コンパイルAPIを2.3.3(API10)にします。理由は後ほど。
プロジェクトができたら肝心のABを入手しましょう。
公式サイトダウンロードページからandroid-binding-v30-0.52.jarをダウンロードしてください。
ダウンロードしたら、jarファイルをプロジェクトのlibsフォルダに放り込みましょう。
eclipseがlibsフォルダに入ったライブラリをビルド時に自動でビルドパスに入れてくれますので特に設定を弄る必要はないです。

入れたら一度プロジェクトをビルドしてパスに含めましょう。

最初ですので簡単にボタンを押したら画面にHello MVVM!と表示するアプリを作ります。
最初にMainActivity.javaを開きます。今回はこのActivityを"View"にしましょう。
まず継承元をActivityからgueei.binding.app.BindingActivityに変更します。
次にsetContentViewをsetAndBindRootViewに変更します。

setAndBindRootViewはActivity - xml - ViewModelの3要素を関連付けるためのメソッドです。
なんとMainActivityの編集はここで終わり。今頃赤線が引かれているであろうMainActivityModel.javaを作成します

MainActivityModelは"ViewModel"です。Viewのプロパティやコマンドを記述し、データストアとしての役割をします。
今回バインディングが必要なプロパティはTextViewのText、ButtonのonClickですね。
バインディングする変数は ~~Observableクラスを用い、コマンドにはCommandクラスを用います。
以下のように記述してください

Observableクラスは変更通知機能を持っています。このクラスのインスタンスが変更されるとViewに通知され更新されます。
次にコンストラクタでmessageプロパティを初期化しましょう

Observableクラスのインスタンスを変更するときはsetメソッドを使います。ちなみに値を取得する時はgetです。
最後にCommandの中身を書きます。今回はmessageに"Hello MVVM!"をsetします。

これでViewModelは完成です。最後にxmlの編集をしましょう。
activity_main.xmlを開きます。まずTextViewとButtonを一つづつ配置してください。
http://pckles.com/laco0416/8df446.png
ルートの部分にbinding名前空間を追加します(stringsリソースに書いておいて呼ぶほうがいいかもしれない)

そして以下のように書き換えてください

TextViewのandroid:textをbinding:textに、Buttonにbinding:onClickを追加しています。
これで終わりです…と言いたいところですが、最後にもう一つだけやらないといけないことがあります。Binderの初期化です。
Applicationクラスを継承した新しいクラスBindingSampleAppを作ります

そして1行 Binder.init を書き加えます

そしてアプリの起動時にまずこのクラスが呼ばれるようにAndroidManifestを編集します(Nameの部分)
http://pckles.com/laco0416/065dab.png
以上です!実行してみてください。ボタンを押すとメッセージが表示されるはずです。

長くなりましたがこれが基本です。ViewからViewModelを操作し、ViewModelの変更をViewに通知するということができました。
どうでしょうか! findViewByIdの呪縛から解き放たれた気分は!とても清々しいですね!
次回はViewModelからViewを操作する方法を解説します。長くなりましたが質問とかあったらぜひどうぞ。