当前位置: 首页 > news >正文

【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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • pdf提取其中一页怎么操作?提取PDF其中一页的方法
  • 02-用户画像-技术架构+业务划分
  • Java中SPI机制原理解析
  • HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 多选题序号2
  • 第100+16步 ChatGPT学习:R实现Xgboost分类
  • 线段树分治+可撤销并查集 学习笔记
  • 机器学习数据集的一致性表现在哪些方面-九五小庞
  • buu做题(7)
  • 大数据开发之Hadoop
  • 【栈和队列】算法题 ---- 力扣
  • rsync文件远程同步
  • BiLSTM 实现股票多变量时间序列预测(PyTorch版)
  • 爬虫爬取网页的信息与图片的方法
  • SpringCloud03_loadbalancer的概述、负载均衡解析、切换、原理
  • Synchronized升级到重量级锁会发生什么?
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • angular2 简述
  • C++类的相互关联
  • Fabric架构演变之路
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • js继承的实现方法
  • JS进阶 - JS 、JS-Web-API与DOM、BOM
  • Laravel 实践之路: 数据库迁移与数据填充
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • VuePress 静态网站生成
  • vue学习系列(二)vue-cli
  • 从0实现一个tiny react(三)生命周期
  • 搞机器学习要哪些技能
  • 七牛云假注销小指南
  • 前端之React实战:创建跨平台的项目架构
  • 巧用 TypeScript (一)
  • 入手阿里云新服务器的部署NODE
  • 深度学习中的信息论知识详解
  • 实战|智能家居行业移动应用性能分析
  • 无服务器化是企业 IT 架构的未来吗?
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • FaaS 的简单实践
  • ​secrets --- 生成管理密码的安全随机数​
  • ​虚拟化系列介绍(十)
  • #Spring-boot高级
  • $(this) 和 this 关键字在 jQuery 中有何不同?
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (3)医疗图像处理:MRI磁共振成像-快速采集--(杨正汉)
  • (9)STL算法之逆转旋转
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (分类)KNN算法- 参数调优
  • (全部习题答案)研究生英语读写教程基础级教师用书PDF|| 研究生英语读写教程提高级教师用书PDF
  • (十七)Flink 容错机制
  • (四)c52学习之旅-流水LED灯
  • (算法)前K大的和
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (转)http协议
  • (转)visual stdio 书签功能介绍