【Android Jetpack系列】一、ViewBinding的使用

2023-05-16

关于本系列的说明

作为学习Jetpack的系列文章, 可能会更新得很慢, 本系列文或者应该称之为学习笔记…

观看本文的同学, 应该已经有具备开发简单Android App的能力了, 若是零基础, 那么阅读本文可能有些难懂, 我只能尽量简单解释。

本文所用开发环境以及SDK版本如下,读者应该使用不低于本文所使用的开发环境.

Android Studio 4.0.1
minSdkVersion 21
targetSdkVersion 30

关于 compileSdkVersion 编译版本的说明, 并不是越高越好, 编译版本越高则表示SDK越新, 这种条件下一般会出现许多新问题, 通常是权限问题。所以这里用的是30(Android 10)

关于本文中的代码片段, 统一采用伪代码形式。

关于本文使用的编程语言, 统一使用 Kotlin

关于 Jectpack 的介绍, 这里就不再赘述了, 百度…

正文

注意:视图绑定在 Android Studio 3.6 Canary 11 及更高版本中可用。

viewBinding 是什么? 直接翻译成中文, 含义就是: 视图绑定

开启 viewBinding

首先找到 项目build.gradle 并打开, 举两张图片。

build.gradle
build.gradle

如何开启呢?官方文档中介绍了两种开启方式, 我们分别来看。

方式一:

android {
    ...
    viewBinding {
        enabled true
    }
    ...
}

方式二(推荐):

android {
    ...
    buildFeatures {
        viewBinding true
    }
    ...
}

这里推荐使用方式二

有的还会这么写, 也是可以的。

android {
    ...
    viewBinding {
        enabled = true
    }
    ...
}
android {
    ...
    buildFeatures {
        viewBinding = true
    }
    ...
}

使用 viewBinding

在 Android 开发中, 传统的寻找控件使用的是 findViewById, 例如在 res/layout/activity_main.xml 中的界面如下:
activity_main.xml

...
<TextView
    android:id="@+id/myTextView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Hello World!"/>
...

对应的TextView的id则是myTextView, 我们来看在代码中寻找并使用 myTextView 的传统方式。

...
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    //通过Id找到对应的view控件
    val myTextView: TextView = findViewById(R.id.myTextView)
    //设置新的文本内容
    myTextView.text = "你好 世界!"
    myTextView.setOnClickListener {
        it as TextView
        it.text = "你点击了我!"
    }
}
...

在使用了viewBinding之后, 则应该是这个样子的。

...
//布局绑定类, 延迟加载
lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    //binding初始化
    binding = ActivityMainBinding.inflate(layoutInflater)
    //将根视图作为内容视图
    setContentView(binding.root)
    //设置新的文本内容
    binding.myTextView.text = "你好 世界!"
    binding.myTextView.setOnClickListener {
        it as TextView
        it.text = "你点击了我!"
    }
}
...

乍一看, 好像代码量变多了, 而且也没有看到什么优势。

那如果, 是这样呢?

...
lateinit var myTextView: TextView
lateinit var myTextView2: TextView
lateinit var myTextView3: TextView
lateinit var myTextView4: TextView
lateinit var myTextView5: TextView
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    myTextView = findViewById(R.id.myTextView)
    myTextView2 = findViewById(R.id.myTextView2)
    myTextView3 = findViewById(R.id.myTextView3)
    myTextView4 = findViewById(R.id.myTextView4)
    myTextView5 = findViewById(R.id.myTextView5)

    myTextView.text = "你好 世界!"
    myTextView2.text = "你好 世界2!"
    myTextView3.text = "你好 世界3!"
    myTextView4.text = "你好 世界4!"
    myTextView5.text = "你好 世界5!"
}
...

使用 viewBinding 之后

...
lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    binding = ActivityMainBinding.inflate(layoutInflater)
    setContentView(binding.root)
    binding.myTextView.text = "你好 世界!"
    binding.myTextView2.text = "你好 世界2!"
    binding.myTextView3.text = "你好 世界3!"
    binding.myTextView4.text = "你好 世界4!"
    binding.myTextView5.text = "你好 世界5!"
}
...

值得注意的是, 一旦开启了 viewBinding 那么所有的 xml 布局文件(layout)都将生成一个 Binding 类, 如果需要过滤掉某些 xml 即: 部分xml不生成Binding类

那么在xml根节点 中添加 tools:viewBindingIgnore="true" 属性即可。

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

findViewById 的区别

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

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

这些差异意味着布局和代码之间的不兼容将会导致构建在编译时(而非运行时)失败。

使用 viewBinding 的不足

  • 视图绑定不支持布局变量或布局表达式,因此不能用于直接在 XML 布局文件中声明动态界面内容。
  • 视图绑定不支持双向数据绑定。

开发过程中, 则需要根据实际情况来决定是否使用 viewBinding 了。

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

【Android Jetpack系列】一、ViewBinding的使用 的相关文章

随机推荐

  • 关于Android studio第一次创建工程时加载过慢的解决方法

    在进行Android开发的时候 xff0c 原来使用的是Android studio2 1版本的 xff0c 突然心血来潮 xff0c 去官网下了一个最新版本的 突然之间遇到许多问题 第一个问题就是第一次创建工程时加载过慢 在网上查找了许多
  • Spring项目实践(三)--- Spring配置文件详解

    不同于我们讲的pom xml以及web xml xff0c 这两个文件的名称是固定的 xff0c 不可更改的 xff0c 这里的设计采用的是约定优于配置的原则 而Spring的配置文件的名称是可以更改的 xff0c 实际上我们在 Sprin
  • Spring项目实践(四)--- Spring MVC配置文件详解

    前三讲我们依次讲了pom xml web xml和spring配置文件 xff0c 这次我们来讲一下springmvc的配置 首先明确一下springmvc是spring的一个模块 springmvc的配置文件 xff0c 也不是固定命名的
  • ShadowSSDT Hook

    ShadowSSDT表的获取 这里的ShadowSSDT表的获取是通过函数KeAddSystemServiceTable来获取的 使用这个函数的原因 xff1a 1 这个函数是已经导出的 xff0c 可以在代码中直接使用 2 这个函数里面使
  • BCTF总结

    缘由 上周 xff0c 我们小组Sigma参加了 百度杯 BCTF比赛 xff0c 经历了难忘的双休 xff0c 这次的BCTF跟以前参加的国内类似的安全比赛有些不同 xff0c 时间只有48小时 xff0c 题目不多 xff0c 但难度大
  • BCTF_海报探秘(300)

    这个题目来自上周的BCTF比赛 xff0c 题目是海报探秘 xff08 300 xff09 xff0c 一张png图片中隐藏了KEY xff0c 解出KEY xff0c 具体报告 xff0c 请下载 xff1a http download
  • 博客转移

    最近好久不来CSDN了 xff0c 自己搭建了一个博客 欢迎各位去新博客留言 http www l0g1n cn 以前学习汇编的博客 http www asmedu net blog user usermain jsp neighborId
  • 《Windows程序设计》之BLOKOUT1

    LRESULT CALLBACK WndProc HWND hwnd UINT message WPARAM wParam LPARAM lParam static BOOL fBlocking fValidBox static POINT
  • MySQL(mariadb)

    MySQL历史 1979年 xff1a TcX公司 Monty Widenius xff0c Unireg1996年 xff1a 发布MySQL1 0 xff0c Solaris版本 xff0c Linux版本1999年 xff1a MyS
  • 天猫抢红包小工具源码

    时间很仓促 xff0c 写的很乱 xff0c 也就能用明天一天了 主要还是学习这个过程 include lt Windows h gt include lt stdio h gt include lt iostream gt include
  • vs2010开发qt程序debug正常,release出错

    在debug模式下 xff0c 配置的动态链接库是qtmaind lib QtGuid4 lib QtCored4 lib 这些链接库 xff0c 在release模式下是不适用的 xff0c 进入到qt的目录下 xff0c 发现了有一些不
  • cout与wcout

    一直以来只知道有cout用来输出 xff0c 今天用cout输出wchar时出现问题了 xff0c 输出结果是一段地址 xff0c 才发现了wcout的存在 使用wcout输出中文时 xff0c 又出现问题 xff0c 中文输出不了 xff
  • 主引导记录(MBR)信息分析与获取

    前段时间在安装黑苹果时 xff0c 发现一个问题 xff0c 电脑在启动时 xff0c 会找激活分区 xff0c 如果没有找到 xff0c 那就启动不起来 那能否写个小程序读取一下MBR信息 xff0c 把激活分区换成其它 xff0c 搞点
  • Duilib登录窗口

    先上效果图 xff08 自己感觉还不错 xff09 xff1a 功能不完善 xff0c 一是为了熟悉xml的写法 xff0c 手写 xff0c 不建议使用编辑器 xff0c 二了为了理顺程序的流程 xff0c 加入了部分注释 xml文件 l
  • Gitee Pages Pro + Hexo自定义域名

    前景摘要 xff1a 最近 xff0c 本菜鸡打算把hexo的博客站点搬到gitee xff0c 毕竟gitee pages pro有一个月的免费自定义域名的机会 xff01 xff01 其实最主要的原因还是coding pages的延迟有
  • 人脸识别流程

    一 人脸识别技术流程 xff1a 1 人脸图像采集及检测 在人脸检测算法中 xff0c 有模板匹配模型 Adaboost模型等 xff0c 其中Adaboost模型在速度和精度的综合性能上表现最好 该算法特点就是训练慢 xff0c 检测快
  • Ubuntu 18.04 系统自带浏览器闪出问题解决

    首先解释一下闪的是什么 xff1f 他是gnome 网络管理器自带的网络链接检查 xff0c 我们会经常遇到它闪以下然后就退出的问题 xff0c 这可能与我们修改主题有关 xff0c 有时还偶尔会看到这个系统自带浏览器没有闪退 xff0c
  • HTML5中 audio标签的样式修改

    由于html5的流行 xff0c 现在移动端大多数的需求都可以使用audio来播放音频 xff0c 但您可能只是需要很简单的播放 停止效果 xff0c 但不同的浏览器上的audio样式却不尽人意 xff0c 那么要怎么改变这个样式呢 xff
  • VC获取当前电脑所有网络连接名字

    最近因为项目有需要获取本机的所有存在的网络连接名称 在网上也找了资料 有好几种方法 不过就只有一种是能够达到我想要的要求 写下来给大家参考下 第一种方法 遍历注册表来获取 void fastcall MyGetLanAdapterName
  • 【Android Jetpack系列】一、ViewBinding的使用

    关于本系列的说明 作为学习Jetpack的系列文章 可能会更新得很慢 本系列文或者应该称之为学习笔记 观看本文的同学 应该已经有具备开发简单Android App的能力了 若是零基础 那么阅读本文可能有些难懂 我只能尽量简单解释 本文所用开