凡所有相,皆是虚妄;若见诸相非相,即见如来。《金刚经》
概述
ViewBinding 是和 Android Studio 3.6 一起发布的,Gradle 要求 3.6.0 ,ViewBinding 可以轻松编写可与视图交互的代码,在模块中启用 ViewBinding 后,系统会该模块中的每个 XML 布局文件生成一个绑定类。绑定类中会为所有具有 ID 视图生成对应的引用。
使用
视图绑定功能可以按模块启用。在模块的 build.gradle 文件中添加如下配置。
代码语言:javascript复制buildFeatures {viewBinding true}
如果需要将某个布局文件禁用 ViewBinding 功能,可以在布局文件根视图添加如下配置:
代码语言:javascript复制
<LinearLayout
tools:viewBindingIgnore="true">
</LinearLayout>
为模块启用视图绑定功能后,我们创建的 XML 布局文件会生成一个绑定类。命名规则采用骆驼峰式大小写命名,并在名称末尾添加 "Binding" 后缀。
例如,布局名称假设为 result_profile.xml:
代码语言:javascript复制
<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,因此绑定类中不存在对它的引用。
每个 Binding类都实现 ViewBinding 接口,并包含一个 getRoot() 方法,ViewBinding接口的定义如下:
代码语言:javascript复制/** A type which binds the views in a layout XML to fields. */
public interface ViewBinding {
/**
* Returns the outermost {@link View} in the associated layout file. If this binding is for a
* {@code <merge>} layout, this will return the first view inside of the merge tag.
*/
@NonNull
View getRoot();
}
getRoot() 方法返回XML的根视图,上述例子 getRoot() 方法返回 LinnerLayout 根视图。
在 Activity 中使用视图绑定
在 Activity使用,需要在 onCreate() 方法中执行如下步骤:
1. 调用绑定类的 inflate() 方法。该方法会生成该绑定类的实例。
2. 通过调用上述步骤生成的 Binding类实例的 getRoot() 方法获取根视图的引用。
3. 调用 setContentView() 方法,将根视图与Activity 绑定。
代码语言:javascript复制
private ResultProfileBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ResultProfileBinding.inflate(getLayoutInflater());
View view = binding.getRoot();
setContentView(view);
}
现在,使用 binding 变量可以直接获取 TextView 类型的 name 视图。
代码语言:javascript复制 binding.getName().setText(viewModel.getName());
binding.button.setOnClickListener(new View.OnClickListener() {
viewModel.userClicked()
});
在 Fragment 中使用视图绑定
在 Fragment 中使用,需要在 onCreateView() 方法中执行如下步骤:
1. 调用绑定类的 inflate() 方法。该方法会生成该绑定类的实例。
2. 通过调用上述步骤生成的 Binding类实例的 getRoot() 方法获取根视图的引用。
3. 从 onCreateView() 方法返回根视图,以供 Fragment 使用。
代码语言:javascript复制 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;
}