当前位置:   article > 正文

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

fragment viewbinding

 

 

目录

前言

官网示例

封装 


 

前言

ViewBinding可以帮助我们减少代码中的大部分findViewById,官网中提到了它的优点和缺点:

  • Null 安全:由于视图绑定会创建对视图的直接引用,因此不存在因视图 ID 无效而引发 Null 指针异常的风险。此外,如果视图仅出现在布局的某些配置中,则绑定类中包含其引用的字段会使用 @Nullable 标记。
  • 类型安全:每个绑定类中的字段均具有与它们在 XML 文件中引用的视图相匹配的类型。这意味着不存在发生类转换异常的风险。 

详情请看官网说明:视图绑定  |  Android 开发者  |  Android Developers 

官网示例

 官网提供了在Fragment中使用的例子,如下:

  1. private ResultProfileBinding binding;
  2. @Override
  3. public View onCreateView (LayoutInflater inflater,
  4. ViewGroup container,
  5. Bundle savedInstanceState) {
  6. binding = ResultProfileBinding.inflate(inflater, container, false);
  7. View view = binding.getRoot();
  8. return view;
  9. }
  10. @Override
  11. public void onDestroyView() {
  12. super.onDestroyView();
  13. binding = null;
  14. }

使用:

  1. binding.getName().setText(viewModel.getName());
  2. binding.button.setOnClickListener(new View.OnClickListener() {
  3. viewModel.userClicked()
  4. });

可以看到官网给出的例子中在onDestroyView里对binding进行了置空处理,如果不进行置空处理可能会导致内存泄露的风险,那么问题来了,我要是有很多个Fragment的话,我总不能每个都加上onDestroyView吧,就算我全部都加上了,没法保证不会漏加,因此我们可以封装一个基类,让其余的Fragment集成于该基类,引用置空统一在基类进行!

封装 

基类的封装如下: 

  1. public abstract class BaseBindingFragment<T extends ViewBinding> extends Fragment {
  2. private T binding;
  3. @Nullable
  4. @Override
  5. public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
  6. // 调用onCreateViewBinding方法获取binding
  7. binding = onCreateViewBinding(inflater, container);
  8. return binding.getRoot();
  9. }
  10. @Override
  11. public void onDestroyView() {
  12. super.onDestroyView();
  13. // 引用置空处理
  14. binding = null;
  15. }
  16. // 子类使用该方法来使用binding
  17. public T getBinding() {
  18. return binding;
  19. }
  20. // 由子类去重写
  21. protected abstract T onCreateViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup parent);
  22. }

基类使用示例:

  1. // 注意加上泛型
  2. public class HomeFragment extends BaseBindingFragment<FragmentHomeBinding> {
  3. // 重写基类的方法
  4. @Override
  5. protected FragmentHomeBinding onCreateViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup parent) {
  6. return FragmentHomeBinding.inflate(inflater, parent, false);
  7. }
  8. @Override
  9. public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
  10. super.onViewCreated(view, savedInstanceState);
  11. // 调用getBinding()使用
  12. getBinding().getTvHelloWord().setText("Hello Android!");
  13. }
  14. }

参考文章: 

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/319870
推荐阅读
相关标签