檢視區塊繫結 Android Jetpack 的一部分。
檢視區塊繫結功能可讓您更輕鬆地編寫與使用者互動的程式碼 以及觀看次數在模組中啟用檢視區塊繫結後,會產生 繫結 類別。繫結的執行個體 類別包含對 對應的版面配置
在大多數情況下,檢視區塊繫結會取代 findViewById
。
設定
每個模組都會啟用檢視區塊繫結。如要在
在模組層級,將 viewBinding
建構選項設為 true
build.gradle
檔案,如以下範例所示:
Groovy
android { ... buildFeatures { viewBinding true } }
Kotlin
android { ... buildFeatures { viewBinding = true } }
如要在產生繫結類別時忽略版面配置檔案,請加入
tools:viewBindingIgnore="true"
屬性導向該版面配置的根層級檢視畫面
檔案:
<LinearLayout
...
tools:viewBindingIgnore="true" >
...
</LinearLayout>
用量
如果為模組啟用檢視區塊繫結,系統會為每個模組產生繫結類別 模組包含的 XML 版面配置檔案。每個繫結類別都包含參照 以及所有具有 ID 的檢視畫面繫結類別的名稱是 方法是將 XML 檔案名稱轉換為 Pascal 命名法,並新增 「Binding」一詞。
舉例來說,假設名為 result_profile.xml
的版面配置檔案內含
包括:
<LinearLayout ... >
<TextView android:id="@+id/name" />
<ImageView android:cropToPadding="true" />
<Button android:id="@+id/button"
android:background="@drawable/rounded_button" />
</LinearLayout>
產生的繫結類別稱為 ResultProfileBinding
。這個類別有兩個
欄位:名為 name
的 TextView
,以及名為 button
的 Button
。
版面配置中的 ImageView
沒有 ID,因此在
繫結類別。
每個繫結類別也包含 getRoot()
方法,可讓您直接使用
對應版面配置檔案根層級檢視畫面的參照。在這個例子中
ResultProfileBinding
類別中的 getRoot()
方法會傳回
LinearLayout
根層級檢視畫面。
以下各節示範如何在 API 中使用產生的繫結類別 活動和片段
在活動中使用檢視繫結
如要設定繫結類別的例項用於活動,請執行
從活動的
onCreate()
方法:
- 呼叫產生的繫結類別中包含的靜態
inflate()
方法。 這會建立活動要使用的繫結類別例項。 - 呼叫
getRoot()
方法或 使用 Kotlin 屬性 語法 - 傳遞根層級檢視畫面至
setContentView()
敬上 讓該元素成為螢幕上的檢視畫面
相關步驟如以下範例所示..
Kotlin
private lateinit var binding: ResultProfileBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ResultProfileBinding.inflate(layoutInflater) val view = binding.root setContentView(view) }
Java
private ResultProfileBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ResultProfileBinding.inflate(getLayoutInflater()); View view = binding.getRoot(); setContentView(view); }
您現在可以使用繫結類別的例項來參照任何檢視畫面:
Kotlin
binding.name.text = viewModel.name binding.button.setOnClickListener { viewModel.userClicked() }
Java
binding.name.setText(viewModel.getName()); binding.button.setOnClickListener(new View.OnClickListener() { viewModel.userClicked() });
在片段中使用檢視區塊繫結
如要設定與片段搭配使用的繫結類別例項,請執行
遵循片段的
onCreateView()
敬上
方法:
- 呼叫產生的繫結類別中包含的靜態
inflate()
方法。 這會建立要使用的片段繫結類別的例項。 - 呼叫
getRoot()
方法或 使用 Kotlin 屬性 語法 - 從
onCreateView()
方法傳回根層級檢視畫面,使其成為 螢幕上的主動式檢視畫面
Kotlin
private var _binding: ResultProfileBinding? = null // This property is only valid between onCreateView and // onDestroyView. private val binding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { _binding = ResultProfileBinding.inflate(inflater, container, false) val view = binding.root return view } override fun onDestroyView() { super.onDestroyView() _binding = null }
Java
private ResultProfileBinding binding; @Override public View onCreateView (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { binding = ResultProfileBinding.inflate(inflater, container, false); View view = binding.getRoot(); return view; } @Override public void onDestroyView() { super.onDestroyView(); binding = null; }
您現在可以使用繫結類別的例項來參照任何檢視畫面:
Kotlin
binding.name.text = viewModel.name binding.button.setOnClickListener { viewModel.userClicked() }
Java
binding.name.setText(viewModel.getName()); binding.button.setOnClickListener(new View.OnClickListener() { viewModel.userClicked() });
為不同設定提供提示
當您宣告多種設定的檢視畫面時,偶爾會發生 這樣就能根據特定版面配置使用不同的檢視區塊類型。 以下程式碼片段為相關示例:
# in res/layout/example.xml
<TextView android:id="@+id/user_bio" />
# in res/layout-land/example.xml
<EditText android:id="@+id/user_bio" />
在這種情況下,您可能會預期產生的類別公開欄位 userBio
類型為 TextView
,因為 TextView
是通用的基本類別。因為
檢視區塊繫結程式碼產生器無法判斷這是否
而是產生 View
欄位。這需要稍後使用
binding.userBio as TextView
。
如要解決這項限制,檢視區塊繫結支援 tools:viewBindingType
屬性,讓您告知編譯器要在產生的程式碼中使用哪種類型。
在上一個範例中,您可以使用這項屬性將編譯器設為
產生欄位做為 TextView
:
# in res/layout/example.xml (unchanged)
<TextView android:id="@+id/user_bio" />
# in res/layout-land/example.xml
<EditText android:id="@+id/user_bio" tools:viewBindingType="TextView" />
再舉一個例子,假設您有兩個版面配置,一個包含
BottomNavigationView
和另一個包含 NavigationRailView
的容器。兩者皆有
類別擴充 NavigationBarView
,其中包含大部分的實作內容
詳細資料。如果您的程式碼不需要確切知道哪個子類別
目前的版面配置,您可以透過 tools:viewBindingType
將產生的
在兩個版面配置中將型別輸入 NavigationBarView
:
# in res/layout/navigation_example.xml
<BottomNavigationView android:id="@+id/navigation" tools:viewBindingType="NavigationBarView" />
# in res/layout-w720/navigation_example.xml
<NavigationRailView android:id="@+id/navigation" tools:viewBindingType="NavigationBarView" />
產生程式碼時,檢視區塊繫結無法驗證這個屬性的值。目的地: 如要避免編譯時間和執行階段錯誤,值必須符合下列條件: 條件:
- 值必須是繼承自
android.view.View
的類別。 這個值必須是其所在標記的父類別。舉例來說, 系統不支援的值:
<TextView tools:viewBindingType="ImageView" /> <!-- ImageView is not related to TextView. --> <TextView tools:viewBindingType="Button" /> <!-- Button is not a superclass of TextView. -->
最終類型必須對所有設定一致解析。
findViewById 的差異
相較於使用 findViewById
,檢視區塊繫結具有重要優點:
- 空值安全性:由於檢視區塊繫結會建立直接參照檢視區塊,
無效檢視畫面 ID 不會導致空值指標例外狀況。
此外,如果檢視畫面只出現在
包含其參照的欄位會在繫結類別中標示出
只在
@Nullable
。 - 「Type safety」:每個繫結類別的欄位所含欄位類型與 每個物件都會在 XML 檔案中參照換言之,課堂內沒有任何風險 投放例外狀況。
這些差異表示版面配置與程式碼不相容 導致建構作業在編譯時間失敗,而不是執行階段
與資料繫結比較
檢視區塊繫結和資料繫結都會產生 可用來直接參照檢視區塊的繫結類別。不過,檢視表 繫結是用於處理較簡單的用途,並提供 具備資料繫結的優點:
- 更快編譯:檢視區塊繫結不需處理註解,因此 就能縮短編譯時間
- 使用方便:檢視區塊繫結不需要特別標記的 XML 版面配置 檔案,就可以更快速地在應用程式中採用。在以下項目中啟用檢視區塊繫結後: 模組,系統會自動將該模組套用至該模組的所有版面配置。
另一方面,與資料相比,檢視區塊繫結具有下列限制 繫結:
- 檢視區塊繫結不支援版面配置變數或版面配置 運算式,才能避免 直接從 XML 版面配置檔案宣告動態 UI 內容。
- 檢視區塊繫結不支援雙向資料 繫結。
基於這些考量,在某些情況下,最好雙管齊下 繫結和資料繫結您可以在 需要進階功能,並在沒有進階功能的版面配置中使用檢視區塊繫結。
其他資源
如要進一步瞭解檢視區塊繫結,請參閱下列其他資源:
範例
網誌
影片
為您推薦
- 注意:系統會在 JavaScript 關閉時顯示連結文字
- 從 Kotlin 合成項目遷移至 Jetpack 檢視區塊繫結
- 版面配置與繫結的運算式
- 應用程式架構:UI 層 - 入門指南 - Android 開發人員