Android 界面库 (一) 之 View binding 简单使用

1. 简介

    在过去Android开发中,一般会使用 findViewById() 方法来获取 XML 布局文件中的 View 对象,然后对该对象进行设置文本、设置是否可见、设置点击事件回调等的视图操作。但是这种对 View 的对象获取和操作的方式会可能存在一些问题,例如:当 findViewById()  方法传入的是一个不存在的 View ID 时, 在使用该对象时就有可能会导致空指针异常;又例如因为 findViewById() 方法是一个泛型方法,若传入的类型与布局文件中的 View 类型不一致时可能会导致类型异常。而且这些异常是可能在运行时发生,这样就会影响应用程序的稳定性。

    View binding 是 Android Jetpack 库的一部分,是 Android 开发中另一种可以代替使用findViewById() 方法的技术,它旨在简化 View 与代码之间的绑定过程。它会在编译时期为每个 XML 布局文件生成相应的绑定类(Binding class),该类里包含了布局文件每个有 ID 的 View 的引用,从而避免了频繁去手动调用 findViewById() 方法获取 View 对象。这样一来,开发者就可以直接通过该 Binding class 访问布局文件中的 View,而无需担心空指针或类型转换异常的发生。

2. 启用 View binding

        如果需要在工程项目中启用 View binding,需要先在项目模块级 buid.gradle 文件中将 viewBinding 构建选项设置为 true, 如:

android {...buildFeatures {viewBinding true}
}

        因为 View Binding 开启后,会在编译时期为每个 XML 布局文件生成相应的 Binding class,这样也会存在一定的编译时间增加和包大小增加,若你明确某个布局文件不需要生在 Binding class,可以将 tools:viewBindingIgnore="true" 属性添加到该布局文件的根视图中,如:

<LinearLayout...tools:viewBindingIgnore="true" >...
</LinearLayout>

3. 使用

    当你工程 Gradle 中配置启用 View binding 后,在工程编译阶段就会为每个布局文件生成对应的绑定类,其中类的名称规则是:XML 文件的名称转换为 Pascal 命名规则的大小写形式,并在末尾添加“Binding”。例如有一个名为 result_profile.xml 的布局文件,其中包含以下内容:

<LinearLayout ... ><TextView android:id="@+id/my_name" /><ImageView android:cropToPadding="true" /><Button android:id="@+id/my_button"android:background="@drawable/rounded_button" />
</LinearLayout>

        所生成的绑定类的名称就是 ResultProfileBinding。此类有两个字段:一个是名为 myName  的  TextView,另一个是名为 myButton 的 Button。因为布局中的 ImageView 没有 ID,所以类中没有对其的引用。

        另外每个绑定类还包含一个 getRoot() 的方法,用于提供相应布局文件的根视图的直接引用。在此示例中,ResultProfileBinding 类中的 getRoot() 方法会返回 LinearLayout 根视图。

3.1. 在 Activity 中使用 View binding

    在 Activity 的 onCreate 方法中,可以执行以下代码来绑定 Activity 和布局文件,以及获取布局文件中的 View 对象:

private lateinit var binding: ResultProfileBindingoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)binding = ResultProfileBinding.inflate(layoutInflater)val view = binding.rootsetContentView(view)binding.myName.text = “Hello world!”binding.myButton.setOnClickListener {// TODO…}
}

说明:

  1. 绑定类中的静态 inflate() 方法用于创建该绑定类的实例以供 Activity 使用。
  2. 通过调用 getRoot() 方法获取对根视图的引用。
  3. 将根视图传递给 setContentView(),使其成为屏幕上的Activity 的View。

3.2. 在 Fragment 中使用View binding

        若要在 Fragment 中使用绑定类,可在其 onCreateView 方法中执行以下代码:

private var _binding: ResultProfileBinding? = null
// This property is only valid between onCreateView and
// onDestroyView.
private val binding get() = _binding!!override fun onCreateView(inflater: LayoutInflater,  container: ViewGroup?,  savedInstanceState: Bundle?): View? {_binding = ResultProfileBinding.inflate(inflater, container, false)val view = binding.rootreturn view
}override fun onDestroyView() {super.onDestroyView()_binding = null
}

说明:

  1. 跟 Activity 一样,使用了绑定类的静态 inflate() 方法来创建绑定类的实例,不同的是此处方法是三个参数的重载版本。
  2. 也是通过调用 getRoot() 方法获取对根视图的引用。
  3. onCreateView() 方法返回根视图对象,使其成为屏幕上的Activity 的 View。
  4. 注意在 onDestroyView 方法中记得要将绑定类置空。

3.3. 不同配置布局类型处理

        如果你的工程中存在多种配置声明View时,有时可能会存在根据特定布局使用不同类型的View 的场景,例如:

# in res/layout/example.xml

<TextView android:id="@+id/user_bio" />

# in res/layout-land/example.xml

<EditText android:id="@+id/user_bio" />

        在此情况下,你可能希望生成的 userBio 字段是 TextView 类型,因为TextView 也是 EditText 的父类,但是因为View binding 在生成代码时是无法在特殊多种配置情况下去验证布局 View 的类型,所以这里就只能默认生成了View 类型的 userBio 字段。然而在后面代码中使用该字段时就需要使用binding.userBio as TextView 来对字段进行转换。

        针对这种特殊情况,View binding 支持 tools:viewBindingType 属性,可告知编译器在生成的代码中使用什么类型。在前面的示例中,可以使用此属性让编译器将字段生成为 TextView,例如:

# in res/layout/example.xml

<TextView android:id="@+id/user_bio" />

# in res/layout-land/example.xml 

<EditText android:id="@+id/user_bio" tools:viewBindingType="TextView" />

注意:

        虽然通过 tools:viewBindingType 属性可在 View binding 在生成代码时指定字段类型,但是其内部是不存在类型校验逻辑的。为避免编译时和运行时错误,该值必须满足以下条件:

  1. 该值必须是继承自 android.view.View 的类。
  2. 该值必须是放置它的代码的父类。若上述示例中将 EditText 中的 tools:viewBindingType 设为 Button 是会产生错误的。
  3. 最终类型必须在所有配置中一致地解析。

4. 总结

        从 Android 官方开发者文档 中可见,View Binding 是官方推荐的视图绑定方案。它提供了一种更安全、更高效的视图绑定方式,可以减少开发者的工作量,并提高代码的可维护性和性能,也降低了潜在的运行时错误风险。因此,如果你正在开发新的 Android 项目, View binding 是一个很不错的选择。更多详细的 View binding 介绍可前往 Android 开发者官网:https://developer.android.com/topic/libraries/view-binding?hl=zh-cn

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

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

相关文章

大数据面试题之Zookeeper面试题

目录 1、介绍下Zookeeper是什么? 2、Zookeeper有什么作用?优缺点?有什么应用场景? 3、Zookeeper的选举策略&#xff0c;leader和follower的区别? 4、介绍下Zookeeper选举算法 5、Zookeeper的节点类型有哪些?分别作用是什么? 6、Zookeeper的节点数怎么设置比较好? …

CSS阴影优化气泡框样式

<body> <div class"pop">气泡框</div> </body>body{display: flex;justify-content: center;align-items: center;height: 100% } .pop{display: flex;justify-content: center;align-items: center;background: #409eff;width: 150px;heigh…

03-Shell编程之循环语句与函数

目录 3.1 for循环语句 3.1.1for语句的结构 3.1.2 for语句应用实例 3.2 使用whlie循环语句 1.打印数字1到5 3.3 使用until循环语句 3.3.1until的实例 1.打印数字1到5&#xff08;使用until的逆向逻辑&#xff09; 2.等待用户输入特定内容 3.4 函数 3.4.1Shell函数的基…

自学C语言-10

第10章 指针 指针是C语言的一个重要组成部分&#xff0c;是C语言的核心、精髓所在。用好指针&#xff0c;可以在C语言开发中起到事半功倍的效果。一方面&#xff0c;可以提高程序的编译效率、执行速度&#xff0c;以及动态存储分配&#xff1b;另一方面&#xff0c;可使程序更加…

代码随想录算法训练营第四十八天 | 188.买卖股票的最佳时机IV、309.最佳买卖股票时机含冷冻期、714.买卖股票的最佳时机含手续费、股票总结

188.买卖股票的最佳时机IV 题目链接&#xff1a;https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/ 文档讲解&#xff1a;https://programmercarl.com/0188.%E4%B9%B0%E5%8D%96%E8%82%A1%E7%A5%A8%E7%9A%84%E6%9C%80%E4… 视频讲解&#xff1a;https://www.bi…

playwright录制脚本原理

Paywright录制工具UI 在上一篇博客中介绍了如何从0构建一款具备录制UI测试的小工具。此篇博客将从源码层面上梳理playwright录制原理。当打开playwright vscode插件时&#xff0c;点击录制按钮&#xff0c;会开启一个新浏览器&#xff0c;如下图所示&#xff0c;在新开浏览器页…

python监听麦克风并调用阿里云的实时语音转文字

import time import threading import queue import sounddevice as sd import numpy as np import nls import sys# 阿里云配置信息 URL "wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1" TOKEN "016ca1620aff421da8fac81b9fb52dc5" # 参考https:/…

Hive基础知识(十八):Hive 函数的使用

1. 系统内置函数 1&#xff09;查看系统自带的函数 hive (hive3)> show functions; Time taken: 0.085 seconds, Fetched: 289 row(s) 2&#xff09;显示自带的函数的用法 hive (hive3)> desc function upper; OK tab_name upper(str)- Returns str with all characters…

“了解MySQL中的enum枚举数据类型“

目录 # 开篇 1. 创建包含枚举类型的表 2. 插入枚举类型的数据 3. 查询包含枚举类型的表 4. 更新枚举类型的数据 5. 使用枚举类型的好处 注意事项 示例总结 附加 # 开篇 在数据库中&#xff0c;枚举&#xff08;ENUM&#xff09;是一种数据类型&#xff0c;用于存储一组…

即插即用篇 | 手把手教你 YOLOv10 添加注意力机制 | 20+ 种全打通!

YOLOv10 添加注意力机制 ! 视频教程地址-哔哩哔哩 文章目录 YOLOv10 添加注意力机制 !注意力机制介绍注意力机制的分类1. SE 注意力模块1.1 原理1.2 代码2. CBAM 注意力模块2.1 原理2.2 代码3. ECA 注意力模块3.1 原理3.2 代码4. CA 注意力模块4.1 原理4.2 代码5. 添加方式�…

构建开源多模态RAG系统

在这个新的冒险中&#xff0c;我们将深入研究使用开源大型语言多模态&#xff08;LLMM&#xff09;构建检索增强型生成&#xff08;RAG&#xff09;系统的过程。值得注意的是&#xff0c;我们的重点是在不依赖LangChain或Llama索引的情况下实现这一点&#xff1b;相反&#xff…

LabVIEW在机器人研究所中的应用

机器人研究所致力于机器人技术的研究与开发&#xff0c;涵盖工业机器人、服务机器人、医疗机器人等多个领域。研究所需要一个高效、灵活的实验控制和数据采集系统&#xff0c;以进行复杂的机器人实验&#xff0c;并对实验数据进行实时处理和分析。 项目需求 实时控制与监控&am…

Python函数魔术:深入理解18个高级函数特性

今天&#xff0c;我们将一起探索那些让代码瞬间变得优雅而强大的高级函数。准备好&#xff0c;让我们一起揭开它们的神秘面纱吧&#xff01; 1. map()&#xff1a;一招制胜&#xff0c;批量操作 想象一下&#xff0c;你需要给一个数字列表的每个元素加上5。普通的循环是不是让…

【PyTorch单点知识】神经元网络模型剪枝prune模块介绍(下,结构化剪枝)

文章目录 0. 前言1. torch.nn.utils.prune中的结构化剪枝方法2. PyTorch实例2.1 random_structured2.2 prune.ln_structured 3. 总结 0. 前言 按照国际惯例&#xff0c;首先声明&#xff1a;本文只是我自己学习的理解&#xff0c;虽然参考了他人的宝贵见解及成果&#xff0c;但…

NC--介绍-未加密加密后-流量抓包对比

免责声明:本节仅做技术交流与学习... 目录 介绍: 用法: 未加密--流量抓包 加密: 攻击端 靶机 抓包分析: 介绍: nc 是一个Linux环境下常用的工具命令&#xff0c;可以用来帮助开发者查询和解决网路问题&#xff0c;通常被认为是 NetCat 工具的缩写&#xff0c;在网络工具…

Hi3861 OpenHarmony嵌入式应用入门--轮询按键

本篇介绍使用轮询方式读取gpio状态来判断按键状态。 原理图如下 GPIO API API名称 说明 hi_u32 hi_gpio_init(hi_void); GPIO模块初始化 hi_u32 hi_io_set_pull(hi_io_name id, hi_io_pull val); 设置某个IO上下拉功能。 hi_u32 hi_gpio_set_dir(hi_gpio_idx id, hi_gpi…

MySQL理解-下载-安装

MySQL理解: mysql:是一种关系型数据库管理系统。 下载&#xff1a; 进入官网MySQLhttps://www.mysql.com/ 找到download 滑动到最下方&#xff1a;有一个开源社区版的链接地址&#xff1a; 然后就下载完成了 安装&#xff1a; 双击&#xff1a; 一直next 一直next这一步&…

仓颉编程语言入门

华为在 2024 年 6 月 21 日的华为开发者大会上&#xff0c;华为终端 BG 软件部总裁龚体正式官宣了华为自研仓颉编程语言&#xff0c;并发布了 HarmonyOS NEXT 仓颉语言开发者预览版。 仓颉编程语言文件后缀名为 .cj, 以下是第一个入门代码输出&#xff1a;你好&#xff0c;仓颉…

ESP32-S3方案应用设备无线交互技术,产品远程控制与语音交互

在物联网和人工智能(AI)技术融合的浪潮中&#xff0c;ESP32-S3芯片以其卓越的性能和多功能性&#xff0c;成为智能家居和工业自动化领域的明星产品。 ESP32-S3是一款基于Xtensa LX6处理器的嵌入式系统级芯片&#xff0c;具有高效、低功耗的特点。集成的Wi-Fi和蓝牙功能&#x…

浔川python代码编辑器——浔川总社部

众所周知, tkinter的Text文本框功能强大, Python自带的IDLE编辑器也是用tkinter编写的。这里作者也用tkinter的Text文本框等控件, 设计功能较齐全的文本编辑器程序。 目标功能: 编辑文本文件 编辑二进制文件 (字符会以转义序列形式显示, 如’abc\xff’) 支持ansi、gbk、utf-8…