ViewBinding 的使用

under Android  tag     Published on June 20th , 2021 at 03:29 pm

写完 ButterKnife 就了解到了另一个的视图绑定:ViewBinding

ViewBinding

通过视图绑定功能,您可以更轻松地编写可与视图交互的代码。在模块中启用视图绑定之后,系统会为该模块中的每个 XML 布局文件生成一个绑定类。绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。

在大多数情况下,视图绑定会替代 findViewById
官网里有的,也就是 Google 自己的东西。

启用 ViewBinding 功能

build.gradle(Module:app) 中添加以下代码

android {
        ...
        viewBinding {
            enabled = true
        }
    }

如果您希望在生成绑定类时忽略某个布局文件,请将 tools:viewBindingIgnore="true" 属性添加到相应布局文件的根视图中:

<LinearLayout
    ...
    tools:viewBindingIgnore="true" >
        ...
</LinearLayout>

使用 ViewBinding

为某个模块启用视图绑定功能后,系统会为该模块中包含的每个 XML 布局文件生成一个绑定类。每个绑定类均包含对根视图以及具有 ID 的所有视图的引用。系统会通过以下方式生成绑定类的名称:将 XML 文件的名称转换为驼峰式大小写,并在末尾添加“Binding”一词。

比如:activity_main.xml 生成的绑定类为 MainActivityBinding。MainActivityBinding 中的 getRoot() 方法会返回该布局的根视图。

在 JAVA 文件中绑定控件,只能绑定设置了 id 的控件。在绑定时,引用的 id 会变更。比如TextView 的 id 是:tv_open,引用会变成:tvOpen。

  • Activity 的视图绑定
    如需设置绑定类的实例以供 Activity 使用,请在 Activity 的 onCreate() 方法中执行以下步骤:
  1. 调用生成的绑定类中包含的静态 inflate() 方法。此操作会创建该绑定类的实例以供 Activity 使用。
  2. 通过调用 getRoot() 方法或使用 Kotlin 属性语法获取对根视图的引用。
  3. 将根视图传递到 setContentView(),使其成为屏幕上的活动视图。
public class MainActivity extends AppCompatActivity {
    ActivityMainBinding viewBinding;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        viewBinding = ActivityMainBinding.inflate(getLayoutInflater());
        setContentView(viewBinding.getRoot());
        viewBinding.tvOpen.setText("这是Activity");
        viewBinding.tvOpen.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                // ... ...
            }
        });
    }
}
  • Fragment 的视图绑定
    如需设置绑定类的实例以供 Fragment 使用,请在 Fragment 的 onCreateView() 方法中执行以下步骤:
  1. 调用生成的绑定类中包含的静态 inflate() 方法。此操作会创建该绑定类的实例以供 Fragment 使用。
  2. 通过调用 getRoot() 方法或使用 Kotlin 属性语法获取对根视图的引用。
  3. onCreateView() 方法返回根视图,使其成为屏幕上的活动视图。
  4. Fragment 的存在时间比其视图长。请务必在 Fragment 的 onDestroyView() 方法中清除对绑定类实例的所有引用。
public class MyFragment extends Fragment {
  private FragmentMyBinding viewBinding;

  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);

  }

  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
                           Bundle savedInstanceState) {
      viewBinding = FragmentMyBinding.inflate(inflater, container, false);
      return viewBinding.getRoot();
  }

  @Override
  public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
      super.onViewCreated(view, savedInstanceState);
      viewBinding.textView.setText("这是Fragment");
      viewBinding.button.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
              // ... ...
          }
      });
  }

  @Override
  public void onDestroy() {
      super.onDestroy();
      viewBinding = null;
  }

ViewBinding 封装(基类)

Android ViewBinding封装(Java)


本文由 surface 创作,采用 知识共享署名4.0 国际许可协议进行许可,转载前请务必署名
  文章最后更新时间为:September 29th , 2021 at 04:37 pm
分享到:Twitter  Weibo  Facebook