Android Studio 3.6中新的视图绑定工具ViewBinding 用法详解
前言
我们在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.
补充:与findViewById的区别
与使用findViewById相比,视图绑定具有重要的优势: •空安全性:由于视图绑定会创建对视图的直接引用,因此不会因无效的视图ID而导致空指针异常的风险。 此外,当视图仅在布局的某些配置中存在时,在绑定类中包含其引用的字段将用@Nullable •类型安全性:每个绑定类中的字段具有与其在XML文件中引用的视图匹配的类型。 这意味着没有类强制转换异常的风险。
这些差异意味着布局和代码之间的不兼容性将导致编译在编译时而不是在运行时失败。
与data binding 库的区别
视图绑定和数据绑定库都生成可用于直接引用视图的绑定类。 但是,有明显的区别: •data binding库仅处理使用标记创建的数据绑定布局。 •view binding不支持布局变量或布局表达式,因此不能用于将布局与XML数据绑定。
到此这篇关于Android Studio 3.6中新的视图绑定工具ViewBinding 用法详解的文章就介绍到这了,更多相关android 视图绑定工具ViewBinding 使用内容请搜索ZaLou.Cn以前的文章或继续浏览下面的相关文章希望大家以后多多支持ZaLou.Cn!
- 更精准!英研究人员利用AI监测预防城市洪水
- 物联网平台的采用将成为2018年首要IT发展趋势
- python基础随笔
- Mysql+Keepalived双主热备高可用操作记录
- Mysql双主热备+LVS+Keepalived高可用操作记录
- 被曝大裁员!曲德君坚称万达网科没有倒下、目标决心不变
- Linux下smokeping网络监控环境部署记录
- Linux下的rsyslog系统日志梳理(用户操作记录审计)
- 数据结构之数组封装
- Centos下内网NDS主从环境部署记录
- 一搜解决,微信的这个功能厉害了!
- Saltstack自动化操作记录(2)-配置使用
- Saltstack自动化操作记录(1)-环境部署
- CentOS源码编译安装Nginx和tcp_proxy module
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 每日两题 T12
- 删除列中的 NULL 值
- Linux生产环境CPU使用率100%,教你定位到具体函数
- Nginx技术总结之二——Nginx进程模型
- 「PostgreSQL技巧」Citus实时执行程序如何并行化查询
- Nginx技术总结之四——集群和负载均衡的算法与实现
- SQL 找出 100 以内的质数
- SQL 获取最长的日期序列
- Lucene基本知识入门
- LeetCode 35. 搜索插入位置
- 【面试系列】反射+动态代理,你为何老是搞不懂?
- 我不知道还可以用 JS 做的 6 件事
- 【服务网格架构】Envoy架构概览(7):断路,全局限速和TLS
- 你的消息队列如何保证消息不丢失,且只被消费一次,这篇就教会你
- 【服务网格架构】Envoy架构概览(9):访问日志,MongoDB,DynamoDB,Redis