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


     

     

    目录

    前言

    官网示例

    封装 


     

    前言

    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 BaseBindingFragmentextends 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 {
    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

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

  • 相关阅读:
    git 后悔药
    中小型工业企业的数字化转型之路
    低代码与数字化工具:重塑软件开发的新范式
    别把爱变成伤害,不要在朋友圈里乱晒娃,朋友圈晒娃注意四点
    数仓建设(二)
    CTFshow Web入门 文件上传
    (二十七)admin-boot项目之集成websocket实时推送消息
    计算机毕业设计Java晶研电子公司业务网站(源码+mysql数据库+系统+lw文档)
    java框架学习笔记——SpringMVC
    MySQL基础三问:底层逻辑、正在执行、日志观察
  • 原文地址:https://blog.csdn.net/qq_38238956/article/details/128117782