データ バインディング ライブラリ   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 フレームワーク呼び出しが不要になり、より簡単かつシンプルに管理できるようになります。これにより、アプリのパフォーマンスが向上し、メモリリークとヌル ポインタ エクセプションの発生を防ぐこともできます。

データ バインディング ライブラリの使用

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 Support Library に含まれているアーキテクチャ コンポーネントを使用して、堅牢でテストとメンテナンスが容易なアプリを設計できます。アーキテクチャ コンポーネントをデータ バインディング ライブラリとともに使用すれば、より簡単に UI を開発できます。
双方向データ バインディング
データ バインディング ライブラリは、双方向データ バインディングをサポートしています。このタイプのバインディングに使用される表記では、プロパティへのデータ変更を受信し、同時にそのプロパティに対するユーザーの更新をリッスンできます。