Data Binding導入から簡単な使い方まで


こんにちは。
最近使い始めて便利だと思ったツールはのDropBox Paper、mukaiyachiです。

先日以前より気になっていたData Bindingを入門程度ですが使ってみました。

DataBindingとは?

Google I/O 2015(2015年5月)にAndroid M Developer Previewと共に発表された技術。

レイアウトのViewの要素とJavaオブジェクトのデータをBindしてくれる機能。
通常はプログラム上でfindViewById()を使って各Viewとデータを結びつけ、さらに、例えばTextViewであればsetText()でデータをセットするといった作業が必要ですが、Data BindingはXML内で宣言的に書けるようになります。
要はJavaオブジェクトの状態に応じて、レイアウトのViewの内容を変更ができるということです。

Data BindingはAndroid 2.1(APIレベル7)以降で使用できます。

メリット

  • コードを簡略化できる。ActivityやFragment の肥大化を防げる。
  • Viewの操作をXmlで完結できる。
  • Viewとロジックの分離が楽になる。
  • レイアウトを使い回す場合、複数箇所で同じようなセットするコードを書かなくて良い。など

デメリット

  • 学習コストが高い。
  • チームで認識の共有が必要。
  • 既存のプロジェクトで採用した場合、大幅な変更が必要。
  • 高度な機能を使う場合はアプリの基本設計をきちんと考える必要がある。
  • 新しい技術で実績がほとんどない。
    など

使い方

1、[app]フォルダ内のbuild.gradleに以下を記述

2、レイアウトとBindするデータクラスを作成

いくつかフィールド変数があって、Getter、Setterがあるようなデータを格納するクラスを用意します。今回は例としてUserクラスを作成しました。

3、レイアウトの作成

■Data Bindingを使用する場合、ルートの要素は<layout>タグ

通常ならルートの要素は<LinearLayout>タグや<RelativeLayout>タグですが、DataBindingを使用する場合、ルートの要素は<layout>タグになります。

■<data>タグ&<variable>タグのバインド対象のメンバーとクラスを指定

  • ルート要素のlayoutタグの中に、dataタグを記述し、さらにimportや宣言を書く。
  • variableタグで使うクラスと変数名を宣言。
  • variableの宣言によって各View内の値としてJavaオブジェクトが使用できる。

■Viewの必要な箇所で@{}の中にデータ取得処理を記述

例えばUserオブジェクトを使用するには、android:text=”@{user.lastName}”のように@{}で挟みます。

4、ActivityでBind

■レイアウトファイルに対応してBinding用のクラスが自動生成される

自動生成されるクラス名はlayoutのファイル名に依存しています。
例えばBindするレイアウトがactivity_main.xmlの場合はActivityMainBindingクラスが、view_item.xmlというファイルの場合はViewItemBindingクラスが生成されます。

■インスタンス化

その自動生成されたクラスをインスタンス化します。

5、Bindingオブジェクトにデータをセット

binding.setUser(bindするデータ)で、findViewByIdしてsetTextとしなくてもTextViewに値が反映されます。

■set◯◯メソッド

データをセットする際にsetUser()を使用していますが、このset◯◯というメソッド名は、レイアウトの<variable>タグのname属性に依存しています。

■Viewにidが指定してあるとBindingオブジェクトからViewへの参照が取得可能

例えばTextViewのid名をtimeTextViewとすることで、Java側でbinding.timeTextViewでアクセスすることができます。

■可変なデータオブジェクトをbindして自動的に更新

これには主に2通りの方法があります。
1. BaseObservableクラスを継承してObservableオブジェクトを定義

  • Getterもしくはfieldどちらかに @Bindable アノテーションを付ける。
  • @Bindable アノテーションを付けると BR クラスが自動で作成される。
  • Setterで notifyPropertyChanged メソッドを呼び出すことで、どのフィールドが変化したかの通知が行われる。

changeName()は、画面上に変更ボタンがあって、そのボタンが押された際に、姓名の表示変更を行うメソッドだと思ってください。

firsetNameはObservableオブジェクトなので、ボタンが押されて値が変更された後、すぐに画面の表示に反映されますが、lastNameはObservableオブジェクトではないので表示は変わりません。

2. Observableフィールドを使用

ObservableフィールドはData BindingをONにしたら使用可能になるもので、フィールドを用意すればGetter、Setterは不要です。

set()やget()といったメソッドが使用できるので、それらを使用して操作します。

changeName()が呼ばれるとfirstName、lastNameどちらもObservableフィールドなので、ボタンが押されて値が変更された後、すぐに画面の表示に反映されます。

以上になりますが、Data Bindingは他にもクリックイベントをBindしたり、レイアウトの中で条件分岐を行えたりなど様々なことを行うことが可能です。
興味がある方は公式ドキュメントをご覧になってみてください。

データ バインディング ライブラリ

便利そうなのでまずは趣味で個人アプリを作る際に使ってみようかと思います。

以上となります。
みなさんも気になりましたらぜひお試しください。