勉強:データバインディングライブラリ?
データバインディングライブラリ知らなかった。。。
ロジックとレイアウトのデータを結びつけるのに最低限のコードで済ませることができるのがこのデータバインディングライブラリ。
今までリストを表示する為に、プログラム上でレイアウトとデータを結び付ける処理が必要だったのですがそれを XML 内に記述ができます。
以下引用と調べた基本的なこと↓
使用可能環境
サポート ライブラリのため、Android 2.1(API レベル 7 以降)のすべての Android プラットフォーム バージョンでお使いいただけます。
データ バインディングを使うには、Android Plugin for Gradle 1.5.0-alpha1以降が必要です。
使用する為に
アプリでデータバイディングを使用するよう設定するには、
dataBinding
要素をアプリ モジュール内のbuild.gradle
ファイルに追加します。設定に使うコード スニペットは次のとおりです。
android {
....
dataBinding {
enabled = true
}
}
実際に使ってみよう♫
データ バインディング用のレイアウト ファイルは通常のレイアウト ファイルとは若干異なっており、最初にルート要素の layout タグがあり、その下に data要素、view のルート要素と続きます。この view 要素は、通常のレイアウト ファイルにおけるルート要素です。サンプル ファイルは以下のようになります。
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable name="user" type="com.example.User"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"/>
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"/>
</LinearLayout>
</layout>data 要素内の user variable で、このレイアウトで使用するプロパティを記述します。
<variable name="user" type="com.example.User"/>レイアウト内の式は、 "
@{}
" 構文を使った属性プロパティで記述します。これで、TextView のテキストが user の firstName に設定されました。<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"/>次にデータオブジェクトの指定をします。User クラスに Plain Old Java Object (POJO) を使用しているとします。
public class User {
public final String firstName;
public final String lastName;
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
}このタイプのオブジェクトが持つデータは変更できません。アプリでは一度だけ読み込んで、その後はまったく変更がないデータを使用することが多くあります。また、JavaBeans オブジェクトを使うこともできます。
public class User {
private final String firstName;
private final String lastName;
public User(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
public String getFirstName() {
return this.firstName;
}
public String getLastName() {
return this.lastName;
}
}データ バインディングの観点では、この 2 つのクラスは同等です。TextView の
android:text
属性に使われる@{user.firstName}
式は、先のクラス内でfirstName
フィールドに、後のクラス内でgetFirstName()
メソッドにアクセスすることになります。または、firstName()
メソッドが存在すれば、そのメソッドに解決されます。データのバインディングについてデフォルトでは、レイアウト ファイルの名前をパスカルケースに変換して、末尾に "Binding" をつけたものがバインディングクラスになります。上のレイアウト ファイルは
main_activity.xml
なので、MainActivityBinding
クラスが作成されます。このクラスにはレイアウト プロパティ(user
変数)からレイアウトのビューまでのすべてのバインディングが含まれ、バインディング式に値を適用する方法が指定されています。バインディングの作成はインフレート中に行うのが最も簡単です。@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MainActivityBinding binding = DataBindingUtil.setContentView(this, R.layout.main_activity);
User user = new User("Test", "User");
binding.setUser(user);
}これで完了です。アプリを実行して、UI で Test User が見えることを確認してください。次のようにしても確認できます。
MainActivityBinding binding = MainActivityBinding.inflate(getLayoutInflater());ListView または RecyclerView アダプタ内でデータ バインディング アイテムを使う場合には、こちらの方法を使用することをお勧めします。
ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false);
//or
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);
リスト、配列およびマップのアクセスについて
一般的なコレクションである配列、リスト、疎なリスト、マップには、便宜上、演算子
[]
を使ってアクセスします。<data>
<import type="android.util.SparseArray"/>
<import type="java.util.Map"/>
<import type="java.util.List"/>
<variable name="list" type="List<String>"/>
<variable name="sparse" type="SparseArray<String>"/>
<variable name="map" type="Map<String, String>"/>
<variable name="index" type="int"/>
<variable name="key" type="String"/>
</data>
…
android:text="@{list[index]}"
…
android:text="@{sparse[index]}"
…
android:text="@{map[key]}"
参考サイト: