產生的繫結類別

資料繫結程式庫會產生繫結類別,您可以使用該類別存取 版面配置的變數和檢視畫面本文件說明如何建立 自訂產生的繫結類別

產生的繫結類別會將版面配置變數與當中的檢視區塊連結 版面配置。您可以自訂 繫結。所有產生的繫結類別都會繼承自 ViewDataBinding 類別。

系統會為每個版面配置檔案產生繫結類別。根據預設 類別是使用 Binding 轉換為 Pascal 命名法的版面配置檔案名稱 加上尾碼舉例來說,如果版面配置檔案名稱是 activity_main.xml,對應的產生的類別為 ActivityMainBinding。 此類別會保留版面配置屬性的所有繫結至版面配置的 檢視畫面,並瞭解如何為繫結運算式指派值。

建立繫結物件

加載版面配置後,繫結物件會立即建立 請確保檢視區塊階層在繫結至含有 版面配置中的運算式最常將物件繫結至 是在繫結類別上使用靜態方法。您可以透過 物件檢視階層,並使用 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);

有時候,您可能事先不知道繫結類型。在這種情況下,您可以 建立繫結 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);

如果您在 FragmentListView,或 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 的資料檢視

資料繫結程式庫會在 3 的繫結類別中建立不可變動的欄位, 版面配置中帶有 ID 的每個檢視畫面。例如:資料繫結程式庫 建立類型為 TextViewfirstNamelastName 欄位 以下版面配置:

<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>

程式庫會從 單次通行證此機制可能會比呼叫 findViewById()敬上 方法。

不需要 ID,因為這類 ID 不包含資料繫結 在某些情況中,必須透過程式碼存取檢視畫面。

變數

資料繫結程式庫會為宣告的每個變數產生存取子方法 版面配置舉例來說,下列版面配置會產生 setter 和 getter 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 會從檢視區塊階層消失,因此 繫結物件也必須消失,才能透過垃圾收集進行聲明。 由於觀看次數是最終人數 ViewStubProxy 物件 取代產生的繫結類別中的 ViewStub,讓您 ViewStub 的存取權 (如果有),且存取加載的檢視畫面 在加載 ViewStub 時套用階層

加載其他版面配置時,必須為新版面配置建立繫結。 因此,ViewStubProxy 必須監聽 ViewStub OnInflateListener敬上 並視需要建立繫結因為只有一個事件監聽器可以存在於 時間,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>

其他資源

如要進一步瞭解資料繫結,請參閱下列其他資源。