全新的视图绑定工具 — ViewBinding 使用指南
发布日期:2021-10-20 03:27:02 浏览次数:12 分类:技术文章

本文共 2505 字,大约阅读时间需要 8 分钟。

前言

我们在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类,则可以使用如下属性添加到布局的根视图中即可:

...

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

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

比如我们的 activity_main.xml文件。

那么生产的绑定类名称为 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.   * 

* Present: *

    *
  • layout/
  • *
* * Absent: *
    *
  • layout-land/
  • *
*/ @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 在未来的地位和作用将不言而喻了吧。

点个在看,证明你还爱我

转载地址:https://blog.csdn.net/u014400934/article/details/103790241 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:从 React 历史的长河里聊虚拟DOM及其价值
下一篇:【Google 出品】31 天,从浅到深轻松学习 Kotlin

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月12日 12时24分23秒