Android开发:Fragment中优雅使用ViewBinding【Java】

 

 

目录

前言

官网示例

封装 


 

前言

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!");
  }
}

参考文章: 

DocumentDescriptionicon-default.png?t=M85Bhttps://dylancaicoding.github.io/ViewBindingKTX/#/zh/baseclass?id=fragment-1

👍点赞,你的认可是我创作的动力 !
🌟收藏,你的青睐是我努力的方向!
✏️评论,你的意见是我进步的财富!   

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦境游子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值