生成されたバインディング クラス

データ バインディング ライブラリが生成するバインディング クラスを使用して、 ビューを作成します。このドキュメントでは、Terraform を使用して 生成されたバインディング クラスのカスタマイズ。

生成されたバインディング クラスは、レイアウト変数をビュー内のビューにリンクします。 できます。名前とパッケージをカスタマイズできます。 あります。生成されたすべてのバインディング クラスは、 ViewDataBinding クラス。

バインディング クラスはレイアウト ファイルごとに生成されます。デフォルトでは、 class は、Binding によってパスカルケースに変換されたレイアウト ファイルの名前です。 接頭辞が追加されます。たとえば、レイアウト ファイル名が activity_main.xml の場合、対応する生成されるクラスは ActivityMainBinding です。 このクラスは、Layout プロパティからレイアウトの バインディング式に値を割り当てる方法を認識します。

バインディング オブジェクトを作成する

レイアウトをインフレートした直後にバインディング オブジェクトが作成され、 ビューにバインドする前に、ビュー階層が変更されていないことを 式を渡します。オブジェクトをバインドする最も一般的なメソッドは、 バインディング クラスの静的メソッドを使用することです。このレイヤをインフレートするには ビュー階層を作成し、そのビュー階層の inflate() メソッドを使用して、オブジェクトをビュー階層にバインドします。 バインディング クラスを定義します。

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)

    val binding: MyLayoutBinding = MyLayoutBinding.inflate(layoutInflater)

    setContentView(binding.root)
}

Java

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater());

    setContentView(binding.root);
}

inflate() メソッドの代替バージョンとして、 ViewGroup オブジェクトの追加、 LayoutInflater オブジェクトは、 例を示しています。

Kotlin

val binding: MyLayoutBinding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false)

Java

MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false);

別のメカニズムを使用してレイアウトをインフレートする場合は、レイアウトをバインドできます。 次のように指定します。

Kotlin

val binding: MyLayoutBinding = MyLayoutBinding.bind(viewRoot)

Java

MyLayoutBinding binding = MyLayoutBinding.bind(viewRoot);

バインディングのタイプが事前にわからない場合もあります。そのような場合は 「kubectl」コマンドを使用して DataBindingUtil クラス、 これを次のコード スニペットに示します。

Kotlin

val viewRoot = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent)
val binding: ViewDataBinding? = DataBindingUtil.bind(viewRoot)

Java

View viewRoot = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent);
ViewDataBinding binding = DataBindingUtil.bind(viewRoot);

データ バインディング アイテムを Fragment ListView、または RecyclerView 使用する場合は、 inflate() バインディング クラスのメソッド、または DataBindingUtil クラスを 次のコードサンプルをご覧ください。

Kotlin

val listItemBinding = ListItemBinding.inflate(layoutInflater, viewGroup, false)
// or
val listItemBinding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false)

Java

ListItemBinding binding = ListItemBinding.inflate(layoutInflater, viewGroup, false);
// or
ListItemBinding binding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false);

ID 付きのビュー

データ バインディング ライブラリは、 ビューが 1 つずつ存在します。たとえば、データ バインディング ライブラリは から、TextView 型の firstName フィールドと lastName フィールドを作成します。 次のようなレイアウトです。

<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}"
   android:id="@+id/firstName"/>
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.lastName}"
  android:id="@+id/lastName"/>
   </LinearLayout>
</layout>

ライブラリは、元の ID を含むビューをビュー階層から抽出し、 あります。このメカニズムは、 findViewById() メソッドを呼び出す必要があります。

データ バインディングがない場合ほど ID は必須ではありませんが、 コードからビューへのアクセスが必要な一部のインスタンス。

変数

データ バインディング ライブラリは、宣言された変数ごとにアクセサ メソッドを生成します。 渡します。たとえば、次のレイアウトではセッターとゲッターが生成されます。 userimagenote 変数のバインディング クラスのメソッドは次のとおりです。

<data>
   <import type="android.graphics.drawable.Drawable"/>
   <variable name="user" type="com.example.User"/>
   <variable name="image" type="Drawable"/>
   <variable name="note" type="String"/>
</data>

ViewStub

通常のビューとは異なり、ViewStub オブジェクト 不可視のビューとしてスタートします見えるようにしたり、明示的にインフレートしたりすると、 別のレイアウトをインフレートすることで、レイアウト内で自身を置き換えます。

ViewStub はビュー階層に表示されなくなるため、 ガベージ コレクションで要求できるようにするために、バインディング オブジェクトも削除する必要があります。 ビューは最終的なものであるため、 ViewStubProxy オブジェクト 生成されるバインディング クラスの ViewStub に代わって、 ViewStub へのアクセス(存在する場合)と、インフレートされたビューへのアクセス ViewStub がインフレートしたときの階層。

別のレイアウトをインフレートする場合は、新しいレイアウト用のバインディングを確立する必要があります。 そのため、ViewStubProxyViewStub をリッスンする必要があります。 OnInflateListener 必要に応じてバインディングを設定します1 つのプロジェクトに存在できるリスナーは 1 つのみであるため、 ViewStubProxy を使用すると、呼び出す OnInflateListener を設定できます。 バインディングを確立した後のテーブルです。

即時バインディング

変数または監視可能なオブジェクトが変更されると、バインディングが変更されるようにスケジュール設定される 次のフレームの前に挿入します。ただし 場合によっては すぐに通知されます。強制的に実行するには、 executePendingBindings() メソッドを呼び出します。

動的変数

具体的なバインディング クラスが不明な場合もあります。たとえば、 RecyclerView.Adapter 任意のレイアウトに対してオペレーションを実行する場合、具体的なバインディング クラスは認識されません。これは、 関数の呼び出し中にバインディング値を割り当てる必要があり、 onBindViewHolder() メソッドを呼び出します。

次の例では、RecyclerView がバインドするすべてのレイアウトに、 item 変数。BindingHolder オブジェクトには getBinding() メソッドがある 返される 基本 ViewDataBinding クラスです。

Kotlin

override fun onBindViewHolder(holder: BindingHolder, position: Int) {
    item: T = items.get(position)
    holder.binding.setVariable(BR.item, item);
    holder.binding.executePendingBindings();
}

Java

public void onBindViewHolder(BindingHolder holder, int position) {
    final T item = items.get(position);
    holder.getBinding().setVariable(BR.item, item);
    holder.getBinding().executePendingBindings();
}

バックグラウンド スレッド

データモデルは、変更されるものがない限り、バックグラウンド スレッドで ありますデータ バインディングは、評価中に各変数またはフィールドをローカライズして、 回避できます

カスタムのバインディング クラスの名前

デフォルトでは、バインディング クラスはレイアウト ファイルの名前に基づいて生成されますが、 先頭を大文字に、アンダースコア(_)を削除し、 末尾に Binding という単語が付加されます。たとえば、レイアウト ファイルは、 contact_item.xmlContactItemBinding クラスを生成します。クラスは これはモジュール パッケージの下の databinding パッケージにあります。たとえば、モジュールが パッケージが com.example.my.app の場合、バインディング クラスは com.example.my.app.databinding パッケージ。

バインディング クラスの名前を変更したり、別のパッケージに配置したりするには、 data 要素の class 属性。たとえば、次のレイアウトの場合: ContactItem バインディング クラスを databinding パッケージに生成し、 現在のモジュール:

<data class="ContactItem">
    ...
</data>

クラスに接頭辞を付けることで、バインディング クラスを別のパッケージ内に生成できます。 終端します。次のサンプルは、 モジュール パッケージ:

<data class=".ContactItem">
    ...
</data>

バインディング クラスを配置する完全なパッケージ名を使用することもできます。 生成されます。次の例では、ContactItem バインディング クラスを com.example パッケージ:

<data class="com.example.ContactItem">
    ...
</data>

参考情報

データ バインディングについて詳しくは、以下の参考情報をご覧ください。