【Jetpack】你说,Xml文件中的View会爱上身在.java文件的对象吗(ViewBinding简单运用)

【Jetpack】你说,Xml文件中的View会爱上身在.java文件的对象吗

在Android开发中,UI的创建和管理一直是开发者必须面对的重要任务。随着时间的发展,Android提供了多种方法来绑定视图和处理它们的逻辑。从最早的findViewById,到后来的ButterKnife,再到现在的DataBinding和ViewBinding,每一次的更新都极大提升了开发效率和代码的可维护性。本文将详细介绍ViewBinding,探讨它的原理、使用方式以及与其他绑定技术的区别。

什么是ViewBinding?

ViewBinding是Android Jetpack的一部分,它使得开发者能够以编程方式安全地绑定视图的ID到对应的视图上。它通过生成绑定类的方式,减少了在运行时使用findViewById查找视图的需要,从而避免了潜在的NullPointerException

在模块中启用视图绑定后,它会为该模块中显示的每个 XML 布局文件生成一个绑定类。绑定类的实例包含对在相应布局中具有 ID 的所有视图的直接引用。

为什么需要ViewBinding?

在传统的开发模式中,开发者需要在xml布局文件中定义视图,然后在代码中通过findViewById来获取这些视图。这种方法虽然简单,但存在几个缺点:

  1. 代码冗余:需要为每个视图编写大量的findViewById代码。
  2. 易出错:手动查找视图容易出错,特别是在布局文件发生改变时。
  3. 性能问题:每次调用findViewById都会进行一次视图树的遍历,影响性能。

相比之下,ViewBinding通过在编译时生成绑定类,可以直接通过变量名访问视图,避免了上述问题。

如何使用ViewBinding?

1. 启用ViewBinding

视图绑定是按模块启用的。如需在模块中启用视图绑定,需要在模块级 build.gradle 文件中将 viewBinding 构建选项设置为 true,如以下示例所示:

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

image-20240718193003779

image-20240718193033364

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

image-20240718194241163

2. 编译时代码生成

ViewBinding的核心原理是在编译时生成绑定代码。当你在build.gradle文件中启用ViewBinding时,Android Gradle插件会在编译过程中为每个布局文件生成一个对应的绑定类。

例如,如果你有一个名为activity_main.xml的布局文件,编译器会生成一个名为ActivityMainBinding的类。这个类包含布局文件中所有视图的直接引用。

3. 绑定类的生成

生成的绑定类包含以下内容:

  • 视图字段:为布局文件中的每个视图生成一个字段。
  • 绑定方法:提供一个方法来获取这些视图的实例。
  • 根视图:一个代表布局根视图的字段。

这些字段和方法都是静态的,并且是线程安全的。

image-20240718193617179

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类进行调用啦~:

image-20240718194132091

5. 性能优化

由于ViewBinding在编译时生成代码,它避免了在运行时使用findViewById查找视图,从而减少了运行时的性能开销。此外,生成的代码是静态的,这意味着它不会受到布局文件变化的影响,从而提高了代码的稳定性。

6. 安全性

ViewBinding通过在编译时生成代码,确保了视图引用的类型安全。这意味着在编译时就能发现类型错误,避免了运行时的ClassCastException。ViewBinding的优点

  1. 减少代码量:不需要手动编写大量的findViewById代码。
  2. 提高代码可读性:直接通过变量名访问视图,代码更直观。
  3. 增强安全性:避免了在运行时查找视图时可能抛出的NullPointerException
  4. 提高性能:减少了视图查找的开销。

与 findViewById 的区别

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

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

结语

通过本文,我们简单了解ViewBinding的原理、使用方法。笔者也是刚写完一整排的findViewById,就看到了这个工具。(大数据真是大大又数数啊)之后的学习过程中,笔者也会继续分享类似于ViewBinding这样好用的工具。

参考:

视图绑定 | Android Developers (google.cn)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值