【Android】使用视图绑定ViewBinding来代替findViewById

文章目录

  • 介绍
  • 作用
  • 用法
    • 开启`ViewBinding`功能
    • 自动生成绑定类
    • 在Activity中使用
    • 访问视图控件
  • 区别

介绍

ViewBinding 是 Android 开发中的一个功能,它简化了访问视图的过程,避免了使用 findViewById 的繁琐步骤。它通过生成与布局文件相对应的绑定类,使得我们能够以类型安全的方式访问布局中的视图。

作用

视图绑定功能可让您更轻松地编写与视图交互的代码。在模块中启用视图绑定后,它会为该模块中显示的每个 XML 布局文件生成一个绑定类。绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。

在大多数情况下,视图绑定会替代 findViewById

用法

开启ViewBinding功能

bulid.gradle.kts中启用

不需要包含任何额外的库来启用视图绑定。从 Android Studio 3.6 中附带的版本开始,它内置于 Android Gradle 插件中。要启用视图绑定,需要在模块级 build.gradle 文件中配置 viewBinding

image-20240718211841342

image-20240718211854902
 buildFeatures{viewBinding = true}

完成后点击sync now同步

自动生成绑定类

绑定类会在编译时自动生成,位于 build/generated/data_binding_base_class_source_out 目录下。

绑定类包含了与 activity_main.xml 布局文件中定义的所有视图的绑定引用

image-20240718221829984

绑定类命名规则

去掉下划线并将每个单词首字母大写(PascalCase)

  • 布局文件名:fragment_sample_list.xml activity_main.xml
  • 生成的绑定类名:FragmentSampleListBinding ActivityMainBinding

在Activity中使用

image-20240719090719804
  1. 声明全局变量
 private ActivityMainBinding binding;

这里ActivityMainBinding类就是步骤2中自动生成的绑定类的名字

  1. 绑定对象
binding = ActivityMainBinding.inflate(getLayoutInflater());

inflate

ActivityMainBinding.inflate 方法是由 ViewBinding 功能自动生成的一个静态方法。它用于创建 ActivityMainBinding 实例。这个方法会解析布局文件 activity_main.xml,并返回一个绑定对象,通过这个对象可以访问布局中的所有视图。

getLayoutInflater

getLayoutInflater 方法是 Activity 类中的一个方法,它用于获取当前 ActivityLayoutInflater 对象。LayoutInflater 是一个用于解析 XML 布局文件并将其转换为相应的视图对象的类。

总结:

  1. 调用 getLayoutInflater 方法获取当前活动的 LayoutInflater 实例。

  2. 使用这个 LayoutInflater 实例调用 ActivityMainBinding.inflate 方法,解析 activity_main.xml 布局文件,并创建一个 ActivityMainBinding 实例。

  3. ActivityMainBinding 实例会包含对 activity_main.xml 布局文件中所有视图的引用。通过这个绑定对象,你可以直接访问布局文件中的视图,而无需使用 findViewById 方法。

  1. 设置内容视图
setContentView(binding.getRoot());

使用setContentView将布局文件加载到当前活动中时,通过binding.getRoot()获取布局资源ID

代码示例:

   public class MainActivity extends AppCompatActivity {// 声明 ViewBinding 全局变量private ActivityMainBinding binding;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 使用 ViewBinding 加载布局binding = ActivityMainBinding.inflate(getLayoutInflater());// 设置当前活动的内容视图为绑定的根视图setContentView(binding.getRoot());}
}

访问视图控件

通过绑定对象,可以直接访问布局文件中的视图控件。

 binding.tv1.setText("修改后");

通过 ViewBinding 直接访问 activity_main.xml 布局文件中的 TextView 控件

image-20240719092932642

 	    binding.tv1.setText("修改后");binding.btn1.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {Toast.makeText(MainActivity.this, "按钮点击", Toast.LENGTH_SHORT).show();}});

区别

与 findViewById 的区别

与使用 findViewById 相比,视图绑定具有一些很显著的优点:

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

这些差异意味着布局和代码不兼容,会导致 build 在编译时(而不是运行时)失败。



感谢您的阅读
如有错误烦请指正


参考:

  1. Android开发解放双手的利器ViewBinding
  2. 视图绑定 | Android Developers
  3. 使用视图绑定替代findViewById

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

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

相关文章

CentOS 7 安装Jenkins2.346.1(war方式安装)

既然想要安装Jenkins,肯定是先要从官网解读所需环境配置信息,如需了解更多自行查阅 https://www.jenkins.io/doc/book/installing/linux/ JDK17,Maven3.9 安装 先从官网分别下载JDK17与Maven3.9 下载好之后上传至服务器、并解压&#xff1a…

算法学习day13(动态规划)

一、打家劫舍III 小偷又发现了一个新的可行窃的地区。这个地区只有一个入口,我们称之为 root 。 除了 root 之外,每栋房子有且只有一个“父“房子与之相连。一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 …

ubuntu 24 PXE Server (bios+uefi) 批量部署系统

pxe server 前言 PXE(Preboot eXecution Environment,预启动执行环境)是一种网络启动协议,允许计算机通过网络启动而不是使用本地硬盘。PXE服务器是实现这一功能的服务器,它提供了启动镜像和引导加载程序,…

dev c++ 添加osg包含目录失败

在dev c 中添加osg的包含目录; 编译程序,出现下图错误; 打开出错文件,修改编码为UTF-8, 错误还是没有消除; 根据资料,osg是基于opengl开发的;不过我也没在osg的目录下看到opengl的头…

2024-07-19 Unity插件 Odin Inspector10 —— Misc Attributes

文章目录 1 说明2 其他特性2.1 CustomContextMenu2.2 DisableContextMenu2.3 DrawWithUnity2.4 HideDuplicateReferenceBox2.5 Indent2.6 InfoBox2.7 InlineProperty2.8 LabelText2.9 LabelWidth2.10 OnCollectionChanged2.11 OnInspectorDispose2.12 OnInspectorGUI2.13 OnIns…

Training for Stable Diffusion

1.Training for Stable Diffusion 笔记来源: 1.Denoising Diffusion Probabilistic Models 2.最大似然估计(Maximum likelihood estimation) 3.Understanding Maximum Likelihood Estimation 4.How to Solve ‘CUDA out of memory’ in PyTorch 1.1 Introduction …

如何设计分布式锁?

1. 为什么需要使用分布式锁? 在实际项目中,经常会遇到多个客户端对同一个资源或数据进行访问,为了避免并发访问带来错误,就会对该资源或数据加一把锁,只允许获得锁的客户端进行操作。 总结来说,分布式锁是…

厕所读物

图片防盗链原理 图片防盗链(Image Hotlinking Protection)是一种防止未经授权的网站直接链接和显示自己服务器上的图片的技术。其主要原理是通过服务器配置和HTTP请求头信息来控制图片的访问权限,具体包括以下几个方面: HTTP Ref…

redis知多少

一、什么是Redis Redis 是一种高性能的键值对(key-value)数据库,它支持多种类型的数据结构,如字符串(strings)、哈希(hashes)、列表(lists)、集合&#xff0…

新能源汽车空调系统的四个工作过程

汽车空调制冷系统组成 1.汽车空调制冷系统组成 以R134a为制冷剂的汽车空调制冷系统主要包括压缩机、电磁离合器、冷凝器、 散热风扇、储液于燥器、膨胀阀、蒸发器、鼓风机、制冷连接管路、高低压检测 连接接头、调节与控制装置等组成。 汽车空调的四个过程 1压缩过程 传统车…

金融数据的pandas模块应用

金融数据的pandas模块应用 数据链接:https://pan.baidu.com/s/1VMh8-4IeCUYXB9p3rL45qw 提取码:c6ys 1. 导入所需基础库 import pandas as pd import matplotlib.pyplot as plt from pylab import mpl mpl.rcParams[font.sans-serif][FangSong] mpl.rcP…

AI大模型如何更好地掀起计算革命,加速国内芯片企业拥抱创新?

AI大模型的兴起已经掀起了一场计算革命,对人工智能技术的发展产生了深远影响,同时也为国内芯片企业带来了前所未有的创新机遇。为了更好地利用这一趋势,加速国内芯片企业的创新步伐,以下是一些关键策略和建议。 AI大模型的发展对…

JAVA.1.新建项目

1.代码结构 2.如何创建项目 1.创建工程 至此,我们创建了我们的第一个工程 2.创建模块 可见已经有了p28的一个模块,删掉了再添加 展开src 3.创建包 4.新建类 5.编写代码 package demo1;public class Hello {public static void main(String[] args) {Sys…

华为od机试真题:火星符号运算(Python)

题目描述 已知火星人使用的运算符号为 #和$ 其与地球人的等价公式如下 x#y2*x3*y4 x$y3*xy2x y是无符号整数。地球人公式按照c语言规则进行计算。火星人公式中,# 号的优先级高于 $ ,相同的运算符,按从左往右的顺序计算 现有一段火星人的字符串报文&a…

基于Centos7搭建rsyslog服务器

一、配置rsyslog可接收日志 1、准备新的Centos7环境 2、部署lnmp环境 # 安装扩展源 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo# 安装扩展源 yum install nginx -y# 安装nginx yum install -y php php-devel php-fpm php-mysql php-co…

rancher2里面的containerd的使用

rancher2使用containerd了,在node上去跑docker命令找不到以前的那些pod了,查了很久才设置好crictl的配置 kubectl get nodes -o wide NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP O…

Django+vue自动化测试平台(28)-- ADB获取设备信息

概述 adb的全称为Android Debug Bridge,就是起到调试桥的作用。通过adb可以在Eclipse中通过DDMS来调试Android程序,说白了就是调试工具。 adb的工作方式比较特殊,采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯,默认情况下…

UNiapp 微信小程序渐变不生效

开始用的一直是这个,调试一直没问题,但是重新启动就没生效,经查询这个不适合小程序使用:不适合没生效 background-image:linear-gradient(to right, #33f38d8a,#6dd5ed00); 正确使用下面这个: 生效,适合…

【TensorRT】Yolov5-DeepSORT 目标跟踪

Yolov5-DeepSORT-TensorRT 本项目是 Yolo-DeepSORT 的 C 实现,使用 TensorRT 进行推理 🚀🚀🚀 开源地址:Yolov5_DeepSORT_TensorRT,求 star⭐ ~ 引言 ⚡ 推理速度可达25-30FPS,可以落地部署&…

LeetCode-day20-2850. 将石头分散到网格图的最少移动次数

LeetCode-day20-2850. 将石头分散到网格图的最少移动次数 题目描述示例示例1:示例2: 思路代码 题目描述 给你一个大小为 3 * 3 ,下标从 0 开始的二维整数矩阵 grid ,分别表示每一个格子里石头的数目。网格图中总共恰好有 9 个石头…