ViewBinding 视图绑定

2023-01-16 14:32:22 浏览数 (2)

凡所有相,皆是虚妄;若见诸相非相,即见如来。《金刚经》

概述

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

0 人点赞