參考翻譯:https://developer.android.google.cn/topic/libraries/view-binding
View Binding是一項功能,使您可以更輕松地編寫與視圖交互的代碼。在模塊中啟用視圖綁定后,它將為該模塊中存在的每個XML布局文件生成一個綁定類。綁定類的實例包含對在相應布局中具有ID的所有視圖的直接引用。
在大多數情況下,視圖綁定替換findViewById。
設置說明
視圖綁定在Android Studio 3.6 Canary 11+中可用。
需要在模塊中啟用視圖綁定,請將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根視圖。
private ResultProfileBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ResultProfileBinding.inflate(layoutInflater);
setContentView(binding.root);
}
綁定類的實例現在可以用於引用任何視圖:
binding.name.text = viewModel.name;
binding.button.setOnClickListener(new View.OnClickListener() {
viewModel.userClicked()
});
與findViewById的區別
與使用findViewById相比,視圖綁定具有重要的優勢:
- 空安全性:由於視圖綁定會創建對視圖的直接引用,因此不會因無效的視圖ID而導致空指針異常的風險。 此外,當視圖僅在布局的某些配置中存在時,在綁定類中包含其引用的字段將用@Nullable
- 類型安全性:每個綁定類中的字段具有與其在XML文件中引用的視圖匹配的類型。 這意味着沒有類強制轉換異常的風險。
這些差異意味着布局和代碼之間的不兼容性將導致編譯在編譯時而不是在運行時失敗。
與data binding 庫的區別
視圖綁定和數據綁定庫都生成可用於直接引用視圖的綁定類。 但是,有明顯的區別:
- data binding庫僅處理使用
標記創建的數據綁定布局。 - view binding不支持布局變量或布局表達式,因此不能用於將布局與XML數據綁定。