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 下載
若有任何問題 歡迎搜索 「朝陽楊大爺」 公衆號給我留言,我會及時回覆!

掃一掃,即刻加入到專屬限免的星球當中,這裏有不少有意思的人,好玩兒的事兒等你來耍!

掃一掃
相關文章
相關標籤/搜索