データ バインディング ライブラリが生成するバインディング クラスを使用して、 ビューを作成します。このドキュメントでは、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 は必須ではありませんが、 コードからビューへのアクセスが必要な一部のインスタンス。
変数
データ バインディング ライブラリは、宣言された変数ごとにアクセサ メソッドを生成します。
渡します。たとえば、次のレイアウトではセッターとゲッターが生成されます。
user
、image
、note
変数のバインディング クラスのメソッドは次のとおりです。
<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
がインフレートしたときの階層。
別のレイアウトをインフレートする場合は、新しいレイアウト用のバインディングを確立する必要があります。
そのため、ViewStubProxy
は ViewStub
をリッスンする必要があります。
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.xml
は ContactItemBinding
クラスを生成します。クラスは
これはモジュール パッケージの下の 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>
参考情報
データ バインディングについて詳しくは、以下の参考情報をご覧ください。
あなたへのおすすめ
- 注: JavaScript がオフになっている場合はリンクテキストが表示されます
- レイアウトとバインディング式
- データ バインディング ライブラリ
- ビュー バインディング