Warning: The 'kotlin-android-extensions' Gradle plugin is deprecated. Please use this migration guide (https://goo.gle/kotlin-android-extensions-deprecation) to start working with View Binding (https://developer.android.com/topic/libraries/view-binding) and the 'kotlin-parcelize' plugin.
kotlin kotlin-android-extensions棄用
參照官方文檔
視圖綁定功能可按子產品啟用。要在某個子產品中啟用視圖綁定,請将
viewBinding
元素添加到其
build.gradle
檔案中,如下例所示:
android {
...
viewBinding {
enabled = true
}
}
如果您希望在生成綁定類時忽略某個布局檔案,請将
tools:viewBindingIgnore="true"
屬性添加到相應布局檔案的根視圖中:
<LinearLayout
...
tools:viewBindingIgnore="true" >
...
</LinearLayout>
用法
為某個子產品啟用視圖綁定功能後,系統會為該子產品中包含的每個 XML 布局檔案生成一個綁定類。每個綁定類均包含對根視圖以及具有 ID 的所有視圖的引用。系統會通過以下方式生成綁定類的名稱:将 XML 檔案的名稱轉換為駝峰式大小寫,并在末尾添加“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 根視圖。
以下幾個部分介紹了生成的綁定類在 Activity 和 Fragment 中的使用。
在 Activity 中使用視圖綁定
如需設定綁定類的執行個體以供 Activity 使用,請在 Activity 的 onCreate() 方法中執行以下步驟:
調用生成的綁定類中包含的靜态 inflate() 方法。此操作會建立該綁定類的執行個體以供 Activity 使用。
通過調用 getRoot() 方法或使用 Kotlin 屬性文法擷取對根視圖的引用。
将根視圖傳遞到 setContentView(),使其成為螢幕上的活動視圖。
kt
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);
}
使用
kt
binding.name.text = viewModel.name
binding.button.setOnClickListener { viewModel.userClicked() }
java
binding.getName().setText(viewModel.getName());
binding.button.setOnClickListener(new View.OnClickListener() {
viewModel.userClicked()
});