Android Jetpack系列——细说DataBinding

看了谷歌官方文章确实写的实在太简略了,甚至看完以后有不少地方还不知道怎么回事儿或者怎么用,那么接下来我将经过几篇文章全面介绍一下 DataBinding 以及 DataBinding 的使用。

DataBinding 背景

DataBinding 是谷歌最先在2015年官方发布的一个框架,顾名思义即为数据绑定。而推出 DataBinding 的目的就是为了减小繁琐的代码,使代码更加的简洁、可读性更强。随着这几年的发展, DataBinding 日渐成熟,应用愈发的普遍。android

DataBinding 的好处

固然,咱们就不在须要使用 FindViewById 了,其实以前,咱们就能够看到不少框架都尝试不在使用 FindViewById 好比 Butterknife 、 XUtil 、 Dragger 等等,可是随着谷歌官方推出了 DataBinding , Kotlin 不少框架都不在使用,甚至不多更新,甚至不更新了。git

使用 DataBinding 会让咱们的布局文件不简简单单的只有一个布局文件的做用,还包含和不少的逻辑。能够大量减小 Activity 内的代码。github

同时 DataBinding 还会让咱们的代码更有层级,结构更加的清晰完善,数据可以单向或者双向绑定到布局文件当中。这样有助于防止内存泄露,并且可以自动进行空检测以免空指针异常。bash

DataBinding 的集成

DataBinding是一个支持库,它能够运行在Android 4.0(API级别14)或更高版本的设备上。app

启用 DataBinding 的方法,首先在对应的 Model 的 build.gradle 文件当中加入如下代码,同步以后就能引入对于 DataBinding 的支持。框架

android {
 
     //引入对 DataBinding 的支持
    dataBinding {
        enabled = true
    }
}

复制代码

之前版本的数据绑定编译器,在编译代码的同步当中生成绑定类。 若是咱们的代码没法编译,咱们将会可能会收到多个错误报告未找到绑定类。 新的数据绑定编译器经过在托管编译器构建应用程序以前生成绑定类来防止这些错误。ide

使用新的数据绑定的编译器,咱们只须要在gradle.properties文件当中,添加上布局

android.databinding.enableV2=true
复制代码

或者,在咱们的gradle文件当中,添加上以下的参数gradle

-Pandroid.databinding.enableV2=true
复制代码

接下来,在布局文件当中,选中根布局的ViewGroup,而后按住 「Alt + 回车键」 如图 ui

图片描述
点击 「Convert to data binding layout」 便可生成就能够生成 DataBinding 须要的布局规则 咱们能够看到,代码以下:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>

    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".MainActivity">

        <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Hello World!"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent"/>

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
复制代码

至此,关于 DataBingding 的集成工做已经完成,接下来,咱们要开始讲讲 DataBinding 的使用。

DataBinding 的简单使用

DataBinding 有不少应用场景和方法,为了介绍的详细一些,我会专门介绍一下 DataBinding 的使用,接下来咱们只介绍一下 DataBinding 的简单的使用。

对比以前的布局文件,咱们发现多出了一个「layout」标签将原来的布局包裹起来,同时还多了一个「data」标签,这个标签是用来声明要用到的变量以及变量的相似使用。

使用 DataBinding 是实现 MVVM 框架必不可少的结构,而 「data」标签就是构建了 View 和 Model 之间的链接通道。这样就能够把数据层(Model)与 UI层(View)绑定在一块儿了。

接下来咱们要声明一个Model

package com.yang.databindingdemo.model


data class Student(val Name: String, val Age: String)

复制代码

接下来,在「data」标签当中声明要使用到的变量、类的全路径。

以下

<data>
        <variable name="studentInfo"
                  type="com.yang.databindingdemo.model.Student"/>
    </data>
复制代码

须要注意的是

若是咱们使用的Student类型会在不少地方用到,咱们也能够采用「import」的方式引进来,这样咱们就不用每次都指明整个包名的路径了。

以下

<data>
        <import type="com.yang.databindingdemo.model.Student"/>
        <variable name="studentInfo"
                  type="Student"/>
    </data>
复制代码

若是咱们「import」相同,咱们还能够采用增长「alias」字段来指定别名。

以下

<data>
        <import type="com.yang.databindingdemo.model.Student"/>
        <import type="com.yang.databindingdemo.model2.Student"
                alias="Student2"/>
        <variable name="studentInfo"
                  type="Student"/>
        <variable name="student2Info"
                  type="Student2"/>
    </data>
复制代码

介绍完以上内容以后,咱们开始正式使用DataBinding。

声明了一个 Student 的相似数据变量 「studentInfo」,接下来咱们就须要把 Student 当中的两个变量和布局文件当中的 TextView

控件关联上,而咱们的关联的方式就是咱们的数据变量 「studentInfo」。

经过设置「studentInfo」变量值,同时使 TextView 显示咱们要设置的文本信息,完整代码以下

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    <data>
        <import type="com.yang.databindingdemo.model.Student"/>
        <variable name="studentInfo"
                  type="Student"/>
    </data>
    <androidx.constraintlayout.widget.ConstraintLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            tools:context=".MainActivity">

        <TextView
                android:id="@+id/tv_studenname"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{studentInfo.name}"
                android:textSize="20sp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.377"/>

        <TextView
                android:id="@+id/tv_age"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="@{studentInfo.age}"
                android:textSize="20sp"
                app:layout_constraintBottom_toBottomOf="parent"
                app:layout_constraintLeft_toLeftOf="parent"
                app:layout_constraintRight_toRightOf="parent"
                app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.276"/>

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>
复制代码

经过代码咱们能够看大搜,经过 「@{studentInfo.name}」能够 让对应的 TextView 控件引入对应的变量。由于 「@{studentInfo.name}」没有任何的值,在布局文件当中不便于观察,咱们能够添加 「default」 属性 以下

android:text="@{studentInfo.name,default = Yang}"
  
  android:text="@{studentInfo.age,default = 18}"
复制代码

这样咱们就能够在布局文件当中看到:

图片描述
这样咱们就方便在布局文件当中查看,以便添加 TextView 控件的相关属性。

写好以后,咱们同步一下,就能够发现 多了一个「ActivityMainBinding」的类,位置如图

图片描述

默认状况下,这个类的名称基于布局文件的名称建立的,将其转换为Pascal大小写并向其添加Binding后缀。上面的布局文件名是activity_main.xml,所以相应的生成类是ActivityMainBinding。

接下来咱们就须要在Activity当中为「userInfo」赋值了。以下

package com.yang.databindingdemo

import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.databinding.DataBindingUtil
import com.yang.databindingdemo.databinding.ActivityMainBinding
import com.yang.databindingdemo.model.Student

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val binding: ActivityMainBinding = DataBindingUtil.setContentView(
            this, R.layout.activity_main
        )
        binding.studentInfo = Student("杨大爷", "20")
    }


}

复制代码

效果如图:

最后

至此,介绍了DataBinding,而且介绍了DataBinding的简单的使用,是否是让你对DataBinding又了一个全新的了解和认识呢?接下来,我再详细的介绍一下如何使用DataBinding,敬请期待!

GitHub传送门 欢迎Star 下载
若有任何问题 欢迎搜索 「朝阳杨大爷」 公众号给我留言,我会及时回复!

扫一扫,即刻加入到专属限免的星球当中,这里有不少有意思的人,好玩儿的事儿等你来耍!

扫一扫
相关文章
相关标签/搜索