Android开发:Fragment中优雅使用ViewBinding【Java】
创始人
2024-03-05 01:19:28
0

 

 

目录

前言

官网示例

封装 


 

前言

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

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

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

官网示例

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

    private ResultProfileBinding binding;@Overridepublic View onCreateView (LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) {binding = ResultProfileBinding.inflate(inflater, container, false);View view = binding.getRoot();return view;}@Overridepublic 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 extends Fragment {private T binding;@Nullable@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {// 调用onCreateViewBinding方法获取bindingbinding = onCreateViewBinding(inflater, container);return binding.getRoot();}@Overridepublic void onDestroyView() {super.onDestroyView();// 引用置空处理binding = null;}// 子类使用该方法来使用bindingpublic T getBinding() {return binding;}// 由子类去重写protected abstract T onCreateViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup parent);
}

基类使用示例:

// 注意加上泛型
public class HomeFragment extends BaseBindingFragment {// 重写基类的方法@Overrideprotected FragmentHomeBinding onCreateViewBinding(@NonNull LayoutInflater inflater, @Nullable ViewGroup parent) {return FragmentHomeBinding.inflate(inflater, parent, false);}@Overridepublic 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

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

相关内容

热门资讯

汽车油箱结构是什么(汽车油箱结... 本篇文章极速百科给大家谈谈汽车油箱结构是什么,以及汽车油箱结构原理图解对应的知识点,希望对各位有所帮...
美国2年期国债收益率上涨15个... 原标题:美国2年期国债收益率上涨15个基点 美国2年期国债收益率上涨15个基...
嵌入式 ADC使用手册完整版 ... 嵌入式 ADC使用手册完整版 (188977万字)💜&#...
重大消息战皇大厅开挂是真的吗... 您好:战皇大厅这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...
盘点十款牵手跑胡子为什么一直... 您好:牵手跑胡子这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游...
senator香烟多少一盒(s... 今天给各位分享senator香烟多少一盒的知识,其中也会对sevebstars香烟进行解释,如果能碰...
终于懂了新荣耀斗牛真的有挂吗... 您好:新荣耀斗牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信8435338】很多玩家在这款游戏...
盘点十款明星麻将到底有没有挂... 您好:明星麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【5848499】很多玩家在这款游戏...
总结文章“新道游棋牌有透视挂吗... 您好:新道游棋牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【7682267】很多玩家在这款游...
终于懂了手机麻将到底有没有挂... 您好:手机麻将这款游戏可以开挂,确实是有挂的,需要了解加客服微信【8435338】很多玩家在这款游戏...