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

news2024/11/27 2:37:46

 

 

目录

前言

官网示例

封装 


 

前言

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/50019.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kotlin小知识之高阶函数

文章目录高阶函数定义高阶函数函数类型高阶函数示例内联函数内联函数的作用内联函数的用法noinline与crossinline高阶函数 定义高阶函数 高阶函数和Lambda的关系是密不可分的.像接受Lambda参数的函数就可以称为具有函数式编程风格的API了当我们想要定义自己的函数式API那就得…

使用 Learner Lab - 使用 AWS Lambda 将图片写入 S3

使用 Learner Lab - 使用 AWS Lambda 将图片写入 S3 AWS Academy Learner Lab 是提供一个帐号让学生可以自行使用 AWS 的服务&#xff0c;让学生可以在 100 USD的金额下&#xff0c;自行练习所要使用的 AWS 服务&#xff0c;以下使用 AWS Lambda 将图片写入 S3。 如何进入 Le…

Git源码(Linus 2005 年提交的最初版本)阅读笔记

Linus 发疯文学欣赏 Git 是 Linux 之父 Linus Torvalds 于2005年开发的用于帮助管理 Linux 内核开发的开源版本控制软件。 美好的一天从阅读 Linus 的发疯文学开始。 (1) Linus 教你学习 Git (2) Linus 评价 CVS (Concurrent Version System) (3) 独一无二的 Linus 调侃结束&a…

手把手教你写一个生成yapi接口代码Chrome 扩展插件

前言 公司想开发个公众号&#xff0c;想在公众号里做业务&#xff0c;也不是做小程序&#xff0c;但是以后也可能做小程序。emm&#xff0c;就是这么随意。所以就找个到了uniapp&#xff0c;说是可以开发一套代码&#xff0c;多平台运行。开发语法还是vue&#xff0c;感觉也没…

RabbitMQ消息队列——快速入门

目录 1、MQ介绍 1.1、什么是MQ&#xff1f; 1.2、MQ的能够解决的问题 1.2.1、削峰填谷 1.2.3、异步处理 1.3、MQ的选择 1.3.1、Kafka 1.3.2、ActiveMQ 1.3.3、RocketMQ 1.3.4、RabbitMQ 2、RabbitMQ的介绍 2.1、RabbitMQ的概述 2.2、AMQP 2.3、JMS 2.4、RabbitMQ…

关系抽取:传统:UniRel: Unified Representation and Interaction for Joint Relational

针对传统下的三元组抽取提出的一种方法&#xff0c;在NYT和webNLG数据集上&#xff0c;再次刷新榜单。 本来对这个结果不是很确定&#xff0c;但作者公布了源码&#xff0c;we can reformulate it . 很少在看到这种文章了吧。 Core idea 换了一种解释思路。 从entity-entity的…

ARM汇编之乘法指令

ARM汇编之乘法指令前言 首先&#xff0c;请问大家几个小小问题&#xff0c;你清楚&#xff1a; 乘法指令有哪些种类呢&#xff1f;ARM乘法指令具体的使用场景又有哪些&#xff1f; 今天&#xff0c;我们来一起探索并回答这些问题。为了便于大家理解&#xff0c;以下是本文的…

精准诊断,精确治疗,智芯传感ZXPA侵入式压力传感器为心血管疾病患者带来福音

近日&#xff0c;据联合国《世界人口展望2022》报告显示&#xff0c;地球人口已正式步入“80亿时代”&#xff01;人口数量增加&#xff0c;从一个侧面反映了人类文明的进步。此外&#xff0c;随着人类预期寿命增加&#xff0c;加上生育率下降&#xff0c;将加剧全球人口老龄化…

基于模型的聚类和R语言中的高斯混合模型

介绍 四种最常见的聚类方法模型是层次聚类&#xff0c;k均值聚类&#xff0c;基于模型的聚类和基于密度的聚类 . 最近我们被客户要求撰写关于聚类的研究报告&#xff0c;包括一些图形和统计输出。 可以基于两个主要目标评估良好的聚类算法&#xff1a; 高组内相似性低组间相…

小程序中的自定义组件以及组件通信、数据共享、插槽、behaviors

一、创建组件和使用自定义组件 1.创建组件 ①在项目的根目录中&#xff0c;鼠标右键&#xff0c;创建components -> 文件夹 ②在新建的components -> 文件夹上,鼠标右键&#xff0c;点击“新建Component ③键入组件的名称之后回车&#xff0c;会自动生成组件对应的4个…

卡尔曼滤波Kalman Filtering:介绍

本文是Quantitative Methods and Analysis: Pairs Trading此书的读书笔记。 控制理论(control theory&#xff09;是工程学的分支之一&#xff0c;主要应对工程系统控制的问题。比如控制汽车发动机的功率输出&#xff0c;稳定电动机的转速&#xff0c;控制“反应速率”&#x…

企业数字化办公利器——华为云桌面Workspace

随着云办公生态的逐渐成熟&#xff0c;华为云桌面也成为了越来越多企业实现随时随地移动办公的选择。 华为云桌面Workspace是一款SAAS产品&#xff0c;是基于华为云云原生架构设计和构建的云桌面服务&#xff0c;可支持云桌面的快速创建、部署和集中运维管理&#xff0c;免除大…

2023年java代做题目参考整理

为方便毕业设计选题&#xff0c;特别整理以下几百题目供参考 班级风采网站的设计 工资绩效管理系统的开发 电子产品销售网站的设计与实现 酒店预订信息管理系统的设计 成绩管理系统 B2C的电子商务系统(J2EE) B2C购物网站设计 教学网站及网上考试系统的设计与实现 ERP采…

STM32学习之Keil5软件配置

前言&#xff1a;代码编写环境可以让编写者在代码编写上有一定的好处&#xff0c;从而得到高效的代码编写。本次笔者写的是一些市面上常用的嵌入式开发软件Keil5&#xff0c;在初始化使用软件界面需要进行配置的。主要分为五大部分&#xff08;文本美化、代码编辑技巧、查找和替…

一篇图解Linux内存碎片整理

我们知道物理内存是以页为单位进行管理的&#xff0c;每个内存页大小默认是4K&#xff08;大页除外&#xff09;。申请物理内存时&#xff0c;一般都是按顺序分配的&#xff0c;但释放内存的行为是随机的。随着系统运行时间变长后&#xff0c;将会出现以下情况&#xff1a; 要解…

树莓派板载蓝牙使用

1 设置树莓派板载蓝牙 1.1 相关环境安装、配置 sudo apt-get update sudo apt-get install pi-bluetooth bluez bluez-firmware blueman1.2 树莓派蓝牙操作 参考&#xff1a; https://blog.csdn.net/guzhong10/article/details/78574577 有时候会失败&#xff0c; 可以尝试…

[附源码]SSM计算机毕业设计学校缴费系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

文件包含总结

概念 是指将已有的代码以文件形式包含到某个指定的代码中&#xff0c;从而使用其中的代码或者数据&#xff0c;一般是为了方便直接调用所需文件&#xff0c;文件包含的存在使得开发变得更加灵活和方便。 文件包含常见函数 include() // 执行到include时才包含文件&#xff…

区间信息维护与查询【线段树 】 - 原理2 线段树中的“懒操作”

区间信息维护与查询【线段树 】 - 原理2 线段树中的“懒操作” 之前我们已经说了对线段树的点更新和区间查询&#xff0c;若要求对区间中的所有点都进行更新&#xff0c;该怎么办&#xff1f; 若对区间的每个点都进行更新&#xff0c;则时间复杂度较高&#xff0c;可以引入懒…

Cocos2d-x 3D渲染技术 (三)

包围盒算法 说白了就是给物体装进一个盒子里&#xff0c;该盒子可以装下物体。目的是为了进行碰撞检测。 种类&#xff1a; 球状碰撞体立方体碰撞体胶囊碰撞体Mesh碰撞体 实现原理是OBB包围盒。 经常使用的两种碰撞算法是OBB包围盒和AABB包围盒算法。 OBB包围盒算法 方向…