データ バインディング ライブラリが生成するバインディング クラスを使用して、 ビューを作成します。このドキュメントでは、Terraform を使用して 生成されたバインディング クラスのカスタマイズ。
生成されたバインディング クラスは、レイアウト変数をビュー内のビューにリンクします。
できます。名前とパッケージをカスタマイズできます。
あります。生成されたすべてのバインディング クラスは、
ViewDataBinding
クラス。
バインディング クラスはレイアウト ファイルごとに生成されます。デフォルトでは、
class は、Binding によってパスカルケースに変換されたレイアウト ファイルの名前です。
接頭辞が追加されます。たとえば、レイアウト ファイル名が
activity_main.xml
の場合、対応する生成されるクラスは ActivityMainBinding
です。
このクラスは、Layout プロパティからレイアウトの
バインディング式に値を割り当てる方法を認識します。
バインディング オブジェクトを作成する
レイアウトをインフレートした直後にバインディング オブジェクトが作成され、
ビューにバインドする前に、ビュー階層が変更されていないことを
式を渡します。オブジェクトをバインドする最も一般的なメソッドは、
バインディング クラスの静的メソッドを使用することです。このレイヤをインフレートするには
ビュー階層を作成し、そのビュー階層の inflate()
メソッドを使用して、オブジェクトをビュー階層にバインドします。
バインディング クラスを定義します。
override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding: MyLayoutBinding = MyLayoutBinding.inflate(layoutInflater) setContentView(binding.root) }
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater()); setContentView(binding.root); }
inflate()
メソッドの代替バージョンとして、
ViewGroup
オブジェクトの追加、
LayoutInflater
オブジェクトは、
例を示しています。
val binding: MyLayoutBinding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false)
MyLayoutBinding binding = MyLayoutBinding.inflate(getLayoutInflater(), viewGroup, false);
別のメカニズムを使用してレイアウトをインフレートする場合は、レイアウトをバインドできます。 次のように指定します。
val binding: MyLayoutBinding = MyLayoutBinding.bind(viewRoot)
MyLayoutBinding binding = MyLayoutBinding.bind(viewRoot);
バインディングのタイプが事前にわからない場合もあります。そのような場合は
「kubectl」コマンドを使用して
DataBindingUtil
クラス、
これを次のコード スニペットに示します。
val viewRoot = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent) val binding: ViewDataBinding? = DataBindingUtil.bind(viewRoot)
View viewRoot = LayoutInflater.from(this).inflate(layoutId, parent, attachToParent); ViewDataBinding binding = DataBindingUtil.bind(viewRoot);
データ バインディング アイテムを
Fragment
ListView
、または
RecyclerView
使用する場合は、
inflate()
バインディング クラスのメソッド、または
DataBindingUtil
クラスを
次のコードサンプルをご覧ください。
val listItemBinding = ListItemBinding.inflate(layoutInflater, viewGroup, false) // or val listItemBinding = DataBindingUtil.inflate(layoutInflater, R.layout.list_item, viewGroup, false)
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
クラスです。
override fun onBindViewHolder(holder: BindingHolder, position: Int) { item: T = items.get(position) holder.binding.setVariable(BR.item, item); holder.binding.executePendingBindings(); }
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>
参考情報
データ バインディングについて詳しくは、以下の参考情報をご覧ください。
あなたへのおすすめ
レイアウトとバインディング式
Discover the latest app development tools, platform updates, training, and documentation for developers across every Android device.
データ バインディング ライブラリ
Discover the latest app development tools, platform updates, training, and documentation for developers across every Android device.
ビュー バインディング
Discover the latest app development tools, platform updates, training, and documentation for developers across every Android device.