全新的视图绑定工具 — ViewBinding 使用指南

2023-05-16

本文首发于微信公众号「Android开发之旅」,欢迎关注 ,获取更多技术干货

Jetpack版Wan-Android项目地址:Android Jetpack架构开发组件化应用实战 欢迎star

Flutter版Wan-Android项目地址:Flutter版Wan-Android 欢迎star

前言

我们在Android开发的过程中总是需要获取XML布局中的ViewId,以便给其赋值进行显示,早期我们只能使用 findViewById 这个API,会导致很多的模版代码出现。2013年左右Android界大神 Jake Wharton开源了Butter Knife框架,通过Bind(“viewid”)方式方便开发者获取ViewId。近两年由于谷歌对Kotlin的支持,我们开始使用 Android Kotlin extensions。 在文件中导入布局文件直接引用viewId。无需做其他额外操作,最为方便。

目前,谷歌在 Android Studio 3.6 Canary 11 及更高版本中加入了新的视图绑定工具 ViewBinding。

下面我们一起看下具体使用。

使用ViewBinding

我们现在开发很多项目都是使用模块化来进行开发的。ViewBinding也是很机智的可以按照模块来启用。如果要在某个模块中启用ViewBinding,则需要在模块的build.gradle中添加如下配置即可:

android {
	
	...
	
	viewBinding {
	    enabled = true
	}

}

如果在使用的过程中开发者不想为某个布局文件生成binding类,则可以使用如下属性添加到布局的根视图中即可:

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

当模块开启视图绑定功能后,系统会为该模块中的每一个XML文件生成对应的绑定类。每一个绑定类均包含对跟视图以及定义了ID的所有视图的引用。

绑定类的名称生成规则是将XML文件的名称按照驼峰命名规则加上Binding进行结尾。

比如我们的 activity_main.xml文件。

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

那么生产的绑定类名称为 ActivityMainBinding。此类具有两个字段:一个是名为 name 的 TextView,另一个是名为 button 的 Button。该布局中的 ImageView 没有 ID,因此绑定类中不存在对它的引用。

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

自动生成的绑定类也并不复杂,主要就是两个inflate重载方法以及一个bind方法。我们获取的对viewId引用就是在bind方法中进行的,内部其实也是通过findViewById来获取相关view的。

我们通常设置布局文件是通过setContentView(“layoutId”),但是使用了ViewBinding后我们需要按照如下方式进行设置layout:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        val binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

		 //获取name进行赋值
        binding.name.text = "viewBinding"
    }
}

这样就可以直接使用了。是不是很简单呢。

但是需要注意的是,如果我们的布局文件分为 layout和layout-land,我们我们在定义布局的时候可能会存在不同的viewId,如果是使用findViewById 或者 Butter Knife 那么肯定就异常了。

我们在使用ViewBinding的时候,绑定类贴心的为我们做了相关的判断。通过 @Nullable 和 @NonNull 两个注解来告诉开发者,哪些view可能为空。并在可能为空的view上添加了相关的注视说明。

  /**
   * This binding is not available in all configurations.
   * <p>
   * Present:
   * <ul>
   *   <li>layout/</li>
   * </ul>
   *
   * Absent:
   * <ul>
   *   <li>layout-land/</li>
   * </ul>
   */
  @Nullable
  public final TextView mAppTv;

提醒开发者在使用的时候​注意异常的处理。​

总结

目前ViewBinding的功能还不够完善,比如XML中使用了 inClude 标签时无法对view进行引用。但总体来说已经很不错了。相比较于 findViewById 和 Butter Knife两种方式还是方便很多的。而且 ViewBinding 在使用的过程中不存在类型转换以及空指针异常的问题。因为在绑定类中已经全部定义好了。开发者直接使用就可以。和 Android Kotlin extensions 相比较我觉得都二者差不多。说不上谁更好。和databinding相比较就是数据绑定库仅处理使用 layout 代码创建的数据绑定布局。它具有局限性。

目前 Jake Wharton 也在 Butter Knife开源库中添加了如下一句话:

Attention: Development on this tool is winding down. Please consider switching to view binding in the coming months.

想必 ViewBinding 在未来的地位和作用将不言而喻了吧。

扫描下方二维码关注公众号,获取更多技术干货。

在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

全新的视图绑定工具 — ViewBinding 使用指南 的相关文章

  • 关于ubuntu下终端打开一闪就退出的一种情况

    终端ctrl 43 alt 43 t后终端一闪即过 首先你换一下访客进入ubuntu查看是否可以打开终端 可以 xff0c 请接着往下看 xff0c 否则抱歉 xff01 首先请你回想一下 xff0c 在这之前你对系统有没有做过什么更改 x
  • 如何转行游戏行业及我眼中的理想游戏开发团队

    前置内容 xff1a 很久没有写文章啦 xff0c 今天就来继续和大家聊一聊关于游戏制作的一些东西 今天主要聊两个方面 xff0c 一个是其他行业转游戏行业的一些注意事项以及需要具备的东西 xff1b 第二是和大家聊一聊我心目中理想的游戏开
  • 浅谈重载new操作符

    new是C 43 43 里非常重要的一个关键词 xff0c 用于申请内存 初始化对象 俗话说 有借有还再借不难 xff0c 通过new向操作系统 借 到的内存用完后必然要 还 回去 xff0c 所以对应地还有一个delete操作符与new共
  • SettingProvider工作原理

    1 基本介绍 SettingsProvider是一个提供设置数据共享的Provider xff0c 可以简单理解为数据库 xff0c 它包含全局性 系统级别的用户编好设置 xff0c 例如在手机中的Settings应用 xff0c 用户可以
  • 多普勒失真信号重采样的Matlab仿真分析

    多普勒失真信号重采样的Matlab仿真分析 应用场景 水声通信指的是使用声信号在水中传输数据 相对而言 xff0c 电磁信号在水中吸收严重衰减过快 xff0c 光信号受水中悬浮颗粒的影响 xff0c 也无法完成远距离传输 这两种信号的传播距
  • 1——Qt安装(ubuntu16.04 + Qt 5.14.2)

    下载Qt http download qt io archive qt 注 xff1a 下载Qt 5 14 2文件夹下的 run 文件 安装Qt 进入下载文件所在位置 xff0c 打开命令行终端 chmod 777 qt opensourc
  • git设置单个仓库用户名以及密码

    有些时候我们的服务器可能要部署多个git仓库 xff0c 不同git仓库的用户名以及密码都是不一样的 xff0c 此时需要我们设置单个仓库的用户名以及密码 1 git设置用户名以及邮箱 命令如下 xff1a git config user
  • php 多版本切换

    项目开发中实际会存在 xff0c php版本不同的情况 下面看具体实现方法 以下均是在 windows 下操作完成 1 先看一下我本地的 php 版本 我这里默认版本是php7 1 xff0c 下面看一下环境变量配置 默认版本不需要改 ph
  • apt-get 安装某个包时出现各种依赖包没有安装、版本不对互相套娃的一种解决方法

    错误信息 Depends 某某包 but it is not going to be installed 或者 Depends 某某包 61 某某版本 but 某某版本 is to be installed 本人是用的树莓派raspbian
  • Python 中更优雅的日志记录方案

    在 Python 中 xff0c 一般情况下我们可能直接用自带的 logging 模块来记录日志 xff0c 包括我之前的时候也是一样 在使用时我们需要配置一些 Handler Formatter 来进行一些处理 xff0c 比如把日志输出
  • 用Python抓包工具查看周边拼车情况

    说起Python爬虫 xff0c 很多人第一个反应可能会是Scrapy或者Pyspider xff0c 但是今天文章里用到是Python下一个叫Mitmproxy的抓包工具 xff0c 对付一些非常规的数据获取还是很有效的 不过凡事都是有利
  • Origin(教育版)无法更改语言是灰色的办法

    用edu后缀的邮箱可以申请正版Origin pro xff0c 但是本人下载下来后是英文版 xff0c 绘图的时候里面很多的专有名词真的一头雾水 xff0c 查看网上的教程说修改注册表 xff0c 试了后发生错误 xff0c 再次打开还是原
  • centos虚拟机切换为命令行模式

    打开命令终端Terminal 输入以下 systemctl set default multi user target 设置成命令模式 或 systemctl set default graphical target 设置成图形模式 最后
  • ubuntu操作不当,桌面图标和菜单栏消失怎么办

    最近配置一些文件没有成功 xff0c 重启后 xff0c 桌面只剩下文件和回收站 xff0c 我们可以通过终端输入指令来解决这个问题 xff0c 亲测有效 先用apt get install指令重装桌面 xff1a 快捷键或者右键打开终端
  • 应用宝-ysdk-米大师 对接道具直购服务器端下单模式 java服务端开发日志

    用于接收回调请求的linux服务器证书配置 xff1a 回调服务器配置分三种 xff0c 前两种是当服务部署在腾讯云上时的配置方式 xff0c 第三种为服务部署在自己服务器上是的配置方式 xff1a hosting应用on CVM xff0
  • 使用python开发json、csv数据格式转换工具

    使用python开发json csv数据格式转换工具 json和xml是业界常用的数据格式 xff0c 而游戏行业经常使用csv配表 xff0c 包括本地化文本和数值 本文介绍csv和json序列化 逆序列化相关的python库 xff0c
  • 【笔记】Ubuntu字体报错

    Warning Cannotconvertstring 34 adobe helvetica medium r normal 120 75 75 p iso8859 1 34 to type FontStruct ENVI 43 IDL o
  • python3-端口扫描(TCP connect扫描,SYN扫描,FIN扫描)

    利用python3进行端口扫描 xff0c TCP的方式有connect扫描 xff0c SYN扫描 xff0c FIN扫描 xff0c NULL扫描 xff0c ACK扫描 xff0c Xmas xff0c windows扫描 本次展示前
  • DirectX(dll)修复软件推荐4.2增强版

    我们经常会遇到在重装完系统后 xff0c 软件或者游戏无法正常运行 xff0c 提示缺少dll文件 xff0c 这时候要么去百度搜索相应dll文件 xff0c 不仅费事还不好找 xff0c 要么就是用DirectX Repair自动扫描安装
  • 未封装的扩展程序

    查看插件 程序展示未封装的扩展程序 如下图 没显示调试工具的原因是用了生产环境的版本或是压缩的vue版本 xff0c 或是没有勾选 xff1a 允许访问文件网址 https span class token punctuation span

随机推荐

  • 2019小结

    2019已经过去 xff0c 回想这过去的一年 xff0c 是近几年来最忙碌的一年 年初 xff0c 参加了一场读书会 xff0c 和公司同事一起读书 一本优秀的书是作者思想的精华 xff0c 通过读书可以认识和了解自己思维以外的世界 虽然
  • 继续前行

    很久没有更新日志了 xff0c 很久没有写博客了 xff1b 我知道我有的时候很忙 xff0c 我知道当前还有更重要的事情 xff0c 我知道事情是做不完的 但不管怎么样 xff0c 我该停下脚步想一想 xff0c 怎么去走好下一步 202
  • 《即兴演讲》读书笔记

    这是一本我一直在寻找的书 xff1b 因为我从事技术工作 xff0c 十多年来每天都和计算机打交道 xff0c 很少有机会站在台上讲话 xff1b 我对演讲是敬畏的 xff0c 想上台表现自己但心里又充满了恐惧 xff1b 偶尔的上台机会只
  • 读“赵4老师”言论

    在查看CSDN论坛时 xff0c 发现 赵4老师 无处不在 xff0c 赵4老师 通常不会直接给出答案 xff0c 而是直接复制言论 赵4老师的语言虽然很 犀利 xff0c 但仔细想想 xff0c 有些还是有道理的 xff0c 至少帮助我从
  • *.map文件

    关于linux程序的map文件 xff0c 网络上资料很少 xff0c 大概看了下map文件 xff0c 虽然理解的不是很透彻 xff0c 但是还是对程序的编译 运行 内存分配有了一点新的认识 1 map文件是程序的全局符号 源文件和代码行
  • python开发环境管理:pip和virtualenv

    python开发环境管理 xff1a pip和virtualenv 不同的python软件需要不同的开发环境 xff0c 互相之间甚至可能有冲突 xff0c 怎么处理 xff1f 使用pip virtualenv和virtualenvwra
  • “异常处理”学习小结

    在我经历过的项目中 xff0c 很少使用异常处理 xff1b 对于问题的调试与追踪 xff0c 基本上都是基于错误码和日志信息 这里的学习总结来自于 lt lt C 43 43 编程思想 第2卷 gt gt 和网络 xff0c 有很多问题的
  • 重载new和delete检测内存泄漏

    内存泄漏就是new出来的内存没有通过delete合理的释放 重载new和delete检测内存泄漏原理是 xff1a 在重载的new中记录内存分配情况 xff0c 在重载的delete中删除内存分配记录 xff0c 从而跟踪所有内存分配信息
  • 《Effective C++》读后感

    几天前 xff0c 我曾在微信朋友圈中发了一条消息 xff1a 和大牛之间的差距就是这一个书架 图片来自于微信公众号 二爷鉴书 的分享 我时常纠结于自己的技术为什么进步的这么慢 xff0c 大概就是书读的太少 思考的太少 Effective
  • 《模仿游戏》观后感

    xfeff xfeff 几天前 xff0c 一个朋友让我给他推荐一部电影 xff0c 我思来想去 xff0c 推荐了 模仿游戏 这部电影讲述的是 计算机科学之父 艾伦 图灵在二战期间与其团队一起发明机器 英格玛 破译德国密码系统的故事 关于
  • 对项目的理解

    xfeff xfeff 又有好久没有更新博客了 xff0c 虽然我一直告诫自己 xff0c 不管有多忙都要找点时间来写博客 最近主要的精力都投入到项目中 xff0c 我就说说自己的一些想法吧 1 项目的前期是最忙的 xff0c 投入最大 当
  • 对项目的理解(2)

    xfeff xfeff 项目是做不完的 xff0c 把近期的一些想法写出来 xff1a 1 项目初期做好每一个功能的方案 项目初期 xff0c 有一个辅助功能被我忽略了 xff0c 以为 很容易实现 xff0c 就没有花时间去研究 xff0
  • 人工智能的过去

    人工智能的起源 xff1a 人工智能在五六十年代时正式提出 xff0c 1950年 xff0c 一位名叫马文 明斯基 后被人称为 人工智能之父 的大四学生与他的同学邓恩 埃德蒙一起 xff0c 建造了世界上第一台神经网络计算机 这也被看做是
  • instant app入门和开发指南

    本文由 a href http renyugang io 2018 05 17 writing 玉刚说写作平台 a 提供写作赞助 xff0c 赞助金额 xff1a 300元 原作者 xff1a AndroFarmer 版权声明 xff1a
  • 解决办法:关于在powershell中进不去anaconda环境

    对于cmd可以进入anaconda xff08 base xff09 环境 xff0c 但是powershell中不可以 xff0c 我的电脑的原因是我的user用户名是中文的 xff0c 先在控制面板和注册表中将用户名改为英文 再用Adm
  • 如何将文件传到Linux服务器中

    操作步骤 xff1a xff08 1 xff09 在本机安装Xftp xff08 2 xff09 连接目标服务器 xff08 3 xff09 选中对应的文件 xff0c 直接拖拽到Linux服务器中 xff0c 等待传输完成即可 如图所示
  • Matlab下多径衰落信道的仿真

    衰落信道参数包括多径扩展和多普勒扩展 时不变的多径扩展相当于一个延时抽头滤波器 xff0c 而多普勒扩展要注意多普勒功率谱密度 xff0c 通常使用Jakes功率谱 高斯 均匀功率谱 多径衰落信道由单径信道叠加而成 xff0c 而单径信道中
  • linux安装Python3

    0 注 xff1a 进行安装时我使用的用户是超级用户root xff0c 如果你不是超级用户在有些命令的前面需要添加sudo xff0c 也可以使用su命令切换成超级用户 1 查看是否有Python3 xff08 有时候虽然有包含但还是一堆
  • chapter8——消抖技术

    目录 1 简介2 开关行为3 开关种类4 消抖5 消抖指南 1 简介 在电子设备内两个金属触点随着触点的断开闭合便产生了多个信号 xff0c 这就是抖动 消抖 是用以确保在每一次断开或闭合触点时只有一个信号起作用的硬件设备或软件 机械开关和
  • 全新的视图绑定工具 — ViewBinding 使用指南

    本文首发于微信公众号 Android开发之旅 xff0c 欢迎关注 xff0c 获取更多技术干货 Jetpack版Wan Android项目地址 xff1a Android Jetpack架构开发组件化应用实战 欢迎star Flutter