Android开发学习笔记——ViewBinding

本文是关于Android开发中ViewBinding的使用教程,包括开启ViewBinding、在Activity、Fragment、自定义View、Dialog及Adapter中使用,以及如何通过Binding类操作View。ViewBinding提供了一种替代findViewById的简洁方式,减少了代码冗余,提高了编译速度,并降低了空指针风险。
摘要由CSDN通过智能技术生成

Android开发学习笔记

在Android开发过程中,当我们需要使用到布局中的组件,为其进行赋值或者设置监听等操作时,我们往往需要先获取到其对象,在最初的Android开发中,我们需要使用findViewById方法,通过组件的id来获取其对象。但是,这种最原始的方法,在xml布局较为复杂时,布局中可能存在十多个甚至几十个,此时如果我们仅仅使用findViewById来获取View对象的话,就会多写很多重复代码,而且显得臃肿和不优雅。而作为开发者,我们当然需要尽量避免这种情况的发生,为了减少视图绑定的工作量和重复代码,ButterKnifeDataBindingAndroid Kotlin Extensions等应运而生。

但是这些方法,或多或少都存在这一些缺陷,而google在AndroidStudio 3.6 版本后推出了ViewBinding,一方面可以让代码更加简洁并且提高编译速度防止空指针。另一方面AndroidStudio是支持ViewBinding进行关联互动的,所以让你在代码与xml之间的跳转更方便。

基本使用

首先,让我们来学习下ViewBinding的基本使用。对于ViewBinding而言,其使用步骤主要分为三步,如下:

  • 开启ViewBinding
  • 进行视图绑定并获取绑定类的实例
  • 使用绑定类实例引用相关View对象并进行相关操作

开启ViewBinding

在Android Studio3.6即之后版本,我们可以使用ViewBinding,该功能可按模块启用,如果我们需要在某个模块中启用视图绑定,我们只需要将viewBinding 元素添加到其对应的 build.gradle 文件中,如下所示:

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

开启ViewBinding后,系统会自动为每个xml布局生成一个对应的Binding类,如果我们在某个布局中不希望使用到ViewBinding,那么,我们只需要在其根View下指定 tools:viewBindingIgnore="true" 即可,如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".viewbinding.ViewBindingActivity"
    tools:viewBindingIgnore="true">

</androidx.constraintlayout.widget.ConstraintLayout>

如此一来,系统在生成绑定类时就会忽略该布局文件。

视图绑定

实际上,对于开发者而言,使用ViewBinding的最重要的一步就是进行视图绑定了,只有完成视图绑定后,我们就可以使用其绑定类的实例来引用View对象了。

为某个模块启用视图绑定功能后,系统会为该模块中包含的每个 XML 布局文件生成一个绑定类。每个绑定类均包含对根视图以及具有 ID 的所有视图的引用。系统会通过以下方式生成绑定类的名称:将 XML 文件的名称转换为驼峰式大小写,并在末尾添加“Binding”一词。而Binding类中会自动生成xml布局中的View引用,并可以以其id的驼峰形式来获取对应的引用。如:存在一个登录界面其xml布局文件为 activity_login.xml,其中存在一个id为 bt_login的button,那么其对应生成的Binding类就为ActivityLoginBinding ,其中存在一个btLogin的Button对象。通过该对象,我们就可以对布局中的 bt_login 进行操作了。

不过Binding类不能直接进行实例化,那么,我们应该如何进行视图绑定,获取Binding类的实例呢?在ViewBinding中主要存在以下几个方法:

  • inflate(LayoutInflater, ViewGroup?, Boolean)
  • bind(View)
Activity中使用ViewBinding

在系统生成的Binding类中,除了我们xml布局文件中的View对象引用以外,每个Binding类还自带一个root对象,其对应的时布局文件的根View。我们知道,对于Activity的视图绑定,我们都是在onCreate方法中使用setContentView来完成的。实际上使用ViewBinding也是一样,不过,我们需要在设置ContentView之前获取到Binding类的实例,以便于我们在之后的代码中使用,具体如下:

class ViewBindingActivity : AppCompatActivity() {
   

    private lateinit var mBinding: ActivityViewBindingBinding

    override fun onCreate(savedInstanceState: Bundle?) {
   
        super.onCreate(savedInstanceState)
//        setContentView(R.layout.activity_view_binding)
        //视图绑定,方法1
        mBinding = ActivityViewBindingBinding.inflate(layoutInflater)
        //方法2
//        mBinding = ActivityViewBindingBinding.bind(LayoutInflater.from(this).inflate(R.layout.activity_view_binding, null))
        //使用root对象设置contentView
        setContentView(mBinding.root)
    }
}

如此一来,我们就完成了Activity的视图绑定了。我们可以看到,实际上没有什么区别,只是在进行setContentView之前,我们通过 inflate 或者 bind 方法获取到了一个Binding类的实例而已,然后使用其root对象来setContentView。

Fragment中使用ViewBinding

同样的,在Fragment中使用ViewBinding,我们只需要在onCreateView方法中返回view之前,获取到Binding类的实例即可,如下所示:

pri
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值