データ バインディング ライブラリ Android Jetpack の一部。
データ バインディング ライブラリは、プログラムではなく宣言形式を使用して、レイアウト内の UI コンポーネントをアプリのデータソースにバインドできるようにするサポート ライブラリです。
レイアウトは多くの場合、UI フレームワーク メソッドを呼び出すコードを含むアクティビティで定義されます。たとえば、以下のコードは findViewById()
を呼び出して TextView
ウィジェットを検索し、viewModel
変数の userName
プロパティにバインドします。
Kotlin
findViewById<TextView>(R.id.sample_text).apply { text = viewModel.userName }
Java
TextView textView = findViewById(R.id.sample_text); textView.setText(viewModel.getUserName());
次の例は、データ バインディング ライブラリを使用して、レイアウト ファイル内でウィジェットにテキストを直接割り当てる方法を示しています。これにより、上記の Java コードを呼び出す必要がなくなります。代入式で @{}
構文を使用することに注意してください。
<TextView
android:text="@{viewmodel.userName}" />
レイアウト ファイル内にコンポーネントをバインディングすると、アクティビティ内の多くの UI フレームワーク呼び出しを削除することができ、メンテナンスがシンプルになります。また、アプリのパフォーマンスが向上し、メモリリークと null ポインタ例外の発生を防ぐこともできます。
データ バインディング ライブラリの使用
以下のページでは、Android アプリでデータ バインディング ライブラリを使用する方法について説明します。
- スタートガイド
- Android Studio でのデータ バインディング コードのサポートなど、データ バインディング ライブラリを開発環境で使用できるようにする方法について説明します。
式言語を使用すると、変数をレイアウト内のビューに接続する式を作成できます。データ バインディング ライブラリは、レイアウト内のビューをデータ オブジェクトにバインドするために必要なクラスを自動的に生成します。このライブラリには、レイアウトで使用できるインポート、変数、インクルードなどの機能が用意されています。
ライブラリのこれらの機能は、既存のレイアウトとシームレスに共存します。たとえば、式で使用できるバインディング変数は、UI レイアウトのルート要素の兄弟要素である data
要素内で定義されます。次の例に示すように、両方の要素が layout
タグでラップされます。
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="viewmodel"
type="com.myapp.data.ViewModel" />
</data>
<ConstraintLayout... /> <!-- UI layout's root element -->
</layout>
- 監視可能なデータ オブジェクトの使用
- データ バインディング ライブラリには、データの変更を簡単に監視するためのクラスとメソッドが用意されています。基盤となるデータソースが変更されたときに UI の更新を考慮する必要はありません。変数やそのプロパティを監視できます。このライブラリを使用すると、オブジェクト、フィールド、コレクションを監視できます。
- 生成されたバインディング クラス
- データ バインディング ライブラリは、レイアウトの変数とビューへのアクセスに使用されるバインディング クラスを生成します。このページでは、生成されたバインディング クラスを使用してカスタマイズする方法について説明します。
- バインディング アダプター
- レイアウト式ごとに、対応するプロパティやリスナーを設定するために必要なフレームワーク呼び出しを行うバインディング アダプターがあります。たとえば、バインディング アダプターは、
setText()
メソッドを呼び出してテキスト プロパティを設定するか、setOnClickListener()
メソッドを呼び出してクリック イベントにリスナーを追加します。このページの例で使用されているandroid:text
プロパティのアダプターなど、最も一般的なバインディング アダプターをandroid.databinding.adapters
パッケージで使用できます。一般的なバインディング アダプターの一覧については、アダプターをご覧ください。次の例に示すように、カスタム アダプターを作成することもできます。
Kotlin
@BindingAdapter("app:goneUnless") fun goneUnless(view: View, visible: Boolean) { view.visibility = if (visible) View.VISIBLE else View.GONE }
Java
@BindingAdapter("app:goneUnless") public static void goneUnless(View view, Boolean visible) { view.visibility = visible ? View.VISIBLE : View.GONE; }
- レイアウト ビューをアーキテクチャ コンポーネントにバインドする
- Android サポート ライブラリに含まれるアーキテクチャ コンポーネントを使用すると、堅牢かつテストと保守が容易なアプリを設計できます。アーキテクチャ コンポーネントをデータ バインディング ライブラリで使用すると、UI の開発をさらに簡素化できます。
- 双方向データ バインディング
- データ バインディング ライブラリは、双方向データ バインディングをサポートしています。このタイプのバインディングで使用される表記では、プロパティへのデータ変更を受け取り、同時にそのプロパティへのユーザー更新をリッスンできます。
参考情報
データ バインディングの詳細については、次の参考情報をご覧ください。
サンプル
Codelab
ブログ投稿
あなたへのおすすめ
- 注: JavaScript がオフになっている場合はリンクテキストが表示されます
- バインディング アダプター {:#binding-adapters}
- レイアウトとバインディング式
- 生成されたバインディング クラス {: #binding-classes}