 
 
目录
前言
官网示例
封装
前言
ViewBinding可以帮助我们减少代码中的大部分findViewById,官网中提到了它的优点和缺点:
- Null 安全:由于视图绑定会创建对视图的直接引用,因此不存在因视图 ID 无效而引发 Null 指针异常的风险。此外,如果视图仅出现在布局的某些配置中,则绑定类中包含其引用的字段会使用 @Nullable标记。
- 类型安全:每个绑定类中的字段均具有与它们在 XML 文件中引用的视图相匹配的类型。这意味着不存在发生类转换异常的风险。
详情请看官网说明:视图绑定 | Android 开发者 | Android Developers
官网示例
官网提供了在Fragment中使用的例子,如下:
    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;
    }
    使用:
    binding.getName().setText(viewModel.getName());
    binding.button.setOnClickListener(new View.OnClickListener() {
        viewModel.userClicked()
    });
    可以看到官网给出的例子中在onDestroyView里对binding进行了置空处理,如果不进行置空处理可能会导致内存泄露的风险,那么问题来了,我要是有很多个Fragment的话,我总不能每个都加上onDestroyView吧,就算我全部都加上了,没法保证不会漏加,因此我们可以封装一个基类,让其余的Fragment集成于该基类,引用置空统一在基类进行!
封装
基类的封装如下:
public abstract class BaseBindingFragment<T extends ViewBinding> extends Fragment {
  private T binding;
  @Nullable
  @Override
  public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    // 调用onCreateViewBinding方法获取binding
    binding = onCreateViewBinding(inflater, container);
    return binding.getRoot();
  }
  @Override
  public void onDestroyView() {
    super.onDestroyView();
    // 引用置空处理
    binding = null;
  }
  // 子类使用该方法来使用binding
  public T getBinding() {
    return binding;
  }
  // 由子类去重写
  protected abstract T onCreateViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup parent);
}基类使用示例:
// 注意加上泛型
public class HomeFragment extends BaseBindingFragment<FragmentHomeBinding> {
  // 重写基类的方法
  @Override
  protected FragmentHomeBinding onCreateViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup parent) {
    return FragmentHomeBinding.inflate(inflater, parent, false);
  }
  @Override
  public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    // 调用getBinding()使用
    getBinding().getTvHelloWord().setText("Hello Android!");
  }
}参考文章:
DocumentDescription https://dylancaicoding.github.io/ViewBindingKTX/#/zh/baseclass?id=fragment-1
https://dylancaicoding.github.io/ViewBindingKTX/#/zh/baseclass?id=fragment-1
👍点赞,你的认可是我创作的动力 !
🌟收藏,你的青睐是我努力的方向!
✏️评论,你的意见是我进步的财富!
















![[附源码]SSM计算机毕业设计学校缴费系统JAVA](https://img-blog.csdnimg.cn/e487e282f76948d388ca739d61f57c83.png)


