【Jetpack】你说,Xml文件中的View会爱上身在.java文件的对象吗
在Android开发中,UI的创建和管理一直是开发者必须面对的重要任务。随着时间的发展,Android提供了多种方法来绑定视图和处理它们的逻辑。从最早的findViewById,到后来的ButterKnife,再到现在的DataBinding和ViewBinding,每一次的更新都极大提升了开发效率和代码的可维护性。本文将详细介绍ViewBinding,探讨它的原理、使用方式以及与其他绑定技术的区别。
什么是ViewBinding?
ViewBinding是Android Jetpack的一部分,它使得开发者能够以编程方式安全地绑定视图的ID到对应的视图上。它通过生成绑定类的方式,减少了在运行时使用findViewById查找视图的需要,从而避免了潜在的NullPointerException。
在模块中启用视图绑定后,它会为该模块中显示的每个 XML 布局文件生成一个绑定类。绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。
为什么需要ViewBinding?
在传统的开发模式中,开发者需要在xml布局文件中定义视图,然后在代码中通过findViewById来获取这些视图。这种方法虽然简单,但存在几个缺点:
- 代码冗余:需要为每个视图编写大量的
findViewById代码。 - 易出错:手动查找视图容易出错,特别是在布局文件发生改变时。
- 性能问题:每次调用
findViewById都会进行一次视图树的遍历,影响性能。
相比之下,ViewBinding通过在编译时生成绑定类,可以直接通过变量名访问视图,避免了上述问题。
如何使用ViewBinding?
1. 启用ViewBinding
视图绑定是按模块启用的。如需在模块中启用视图绑定,需要在模块级 build.gradle 文件中将 viewBinding 构建选项设置为 true,如以下示例所示:
android {
...
viewBinding {
enabled = true
}
}


配置完之后记得点击一下Sync Now按钮!

2. 编译时代码生成
ViewBinding的核心原理是在编译时生成绑定代码。当你在build.gradle文件中启用ViewBinding时,Android Gradle插件会在编译过程中为每个布局文件生成一个对应的绑定类。
例如,如果你有一个名为activity_main.xml的布局文件,编译器会生成一个名为ActivityMainBinding的类。这个类包含布局文件中所有视图的直接引用。
3. 绑定类的生成
生成的绑定类包含以下内容:
- 视图字段:为布局文件中的每个视图生成一个字段。
- 绑定方法:提供一个方法来获取这些视图的实例。
- 根视图:一个代表布局根视图的字段。
这些字段和方法都是静态的,并且是线程安全的。

4. 视图访问
在Activity或Fragment中,你可以通过以下方式访问视图:
public class MainActivity extends AppCompatActivity {
private ActivityMainBinding binding;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
binding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(binding.getRoot());
binding.textView.setText("Hello, ViewBinding!");
}
}
在这个例子中:
ActivityMainBinding.inflate(getLayoutInflater()):调用inflate方法来加载布局,并返回一个绑定对象。setContentView(binding.getRoot()):将绑定对象的根视图设置为Activity的内容视图。binding.textView.setText(...):直接通过绑定对象访问视图并设置文本。
可以直接用binding类进行调用啦~:

5. 性能优化
由于ViewBinding在编译时生成代码,它避免了在运行时使用findViewById查找视图,从而减少了运行时的性能开销。此外,生成的代码是静态的,这意味着它不会受到布局文件变化的影响,从而提高了代码的稳定性。
6. 安全性
ViewBinding通过在编译时生成代码,确保了视图引用的类型安全。这意味着在编译时就能发现类型错误,避免了运行时的ClassCastException。ViewBinding的优点
- 减少代码量:不需要手动编写大量的
findViewById代码。 - 提高代码可读性:直接通过变量名访问视图,代码更直观。
- 增强安全性:避免了在运行时查找视图时可能抛出的
NullPointerException。 - 提高性能:减少了视图查找的开销。
与 findViewById 的区别
与使用 findViewById 相比,视图绑定具有一些很显著的优点:
- Null 安全:由于视图绑定会创建对视图的直接引用,因此不存在因视图 ID 无效而引发 null 指针异常的风险。此外,当视图仅存在于布局的某些配置中时,绑定类中包含其引用的字段会标记为
@Nullable。 - 类型安全:每个绑定类中的字段都具有与其在 XML 文件中引用的视图相匹配的类型。这意味着不存在发生类转换异常的风险。
结语
通过本文,我们简单了解ViewBinding的原理、使用方法。笔者也是刚写完一整排的findViewById,就看到了这个工具。(大数据真是大大又数数啊)之后的学习过程中,笔者也会继续分享类似于ViewBinding这样好用的工具。
参考:
&spm=1001.2101.3001.5002&articleId=140531513&d=1&t=3&u=6362b3662d8b4170a32a808c1782be4e)

被折叠的 条评论
为什么被折叠?



