日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Android?JetPack組件的支持庫Databinding詳解_Android

作者:Cola可洛 ? 更新時間: 2022-09-27 編程語言

簡介

DataBinding 是 Google 在 Jetpack 中推出的一款數據綁定的支持庫,利用該庫可以實現在頁面組件中直接綁定應用程序的數據源。使其維護起來更加方便,架構更明確簡介。

DataBinding 唯一的作用,也是他的使命,就是綁定數據,以及所有的支持庫,本質上都是為了支持這個功能。綁定一詞有兩種解釋,第一是將數據綁定在 UI 元素;第二是將 UI 上的數據綁定到對應的數據模型,還支持對數據及 UI 的變動觀察,其中一個發生變動就需要同步到另一個上去。

啟用databinding

首先設置使用 Databinding,在 app module 的 build.gradle 中添加如下代碼即可:

android {
? ? ...
? ? dataBinding {
? ? ? ? enabled = true
? ? }
}

布局xml

根結點必須為<layout>,只能存在一個<data>和一個直接子View結點。

variable (變量標簽)

變量的屬性名name不能包含_下劃線,否則再kt文件里會找不到變量,有時可能需要指定自定義類型,可以使用 import 語法來導入類,以及使用 alias 設置別名

    <data>
        <import type="com.example.databinding.Entity.User"/>
        <import type="com.example.databinding.Entity.user.User" alias="member"/>
        <variable
            name="user"
            type="User" />
        <variable
            name="member"
            type="member" />
    </data>

當需要使用兩個同名但不同包名的類,可以使用alias別名屬性

data (數據標簽)

它有個屬性class,可以自定義DataBinding生成的類名及路徑

<data class="ObservableDataBinding"> </data>

@{}表達式

運算符

運算類型 運算符
算術運算符 + - / * %
字符串連接運算符 +
邏輯運算符 &&
二元運算符 &
一元運算符 + - ! ~
移位運算符 >> >>> <<
三元運算符 == > < >= <=
分組運算符 ()

關鍵字

instanceof

字符、字符串、數字、null

類型轉換

方法調用

字段訪問

數組訪問 []

綁定普通數據

DataBinding 可以綁定普通數據對象(非 Observable/LiveData)

<data>
        <import type="java.lang.String"/>
        <variable name="content" type="String" />
</data>

綁定可觀察數據

綁定可觀察數據意味著當數據變化時 UI 會跟著一起變化,綁定可觀察數據有三種方式:objectsfieldscollections.

對單個變量的綁定-fields

對于一些數據類只需要其中幾個字段支持可觀察,那么可以使用這種方式來創建可觀察數據

data class User(
	val name: ObservableField<String>,
    val likes: ObservableInt
)

基本數據類型直接使用對應的包裝類

基本數據類型 包裝類
boolean ObservableBoolean
byte ObservableByte
char ObservableChar
short ObservableShort
int ObservableInt
long ObservableLong
float ObservableFloat
double ObservableDouble

引用類型使用帶有泛型參數的 ObservableField 類來創建

val name: ObservableField<String>

對集合的綁定-collections

<data>
    <import type="android.databinding.ObservableList"/>
    <variable name="user" type="ObservableList<Object>"/>
</data>
<TextView android:text="@{user[index]}" ... />

可以直接使用 [] 運算符( list[0] )獲取對應位置的元素

綁定對象-objects

需要綁定的數據實體類繼承 BaseObservable

class Person : BaseObservable() {
    @get:Bindable
    var country: String = ""
        set(value) {
            field = value
            notifyPropertyChanged(BR.country)
        }
    @get:Bindable
    var sex: String = ""
        set(value) {
            field = value
            notifyPropertyChanged(BR.sex)
        }
}

需要支持可觀察的數據上添加 @get:Bindable 注解,然后重寫 set 方法,在其中調用 notifyPropertyChanged 方法表示更新該數據,BR 是自動生成的,包名跟當前包名一致,會根據 Bindable 注解的變量生成對應的值;也可以調用 notifyChange() 方法更新所有數據

綁定LiveData

LiveData也支持數據綁定

<?xml version="1.0" encoding="utf-8"?>
<layout>
    <data>
        <variable name="desc"
            type="androidx.lifecycle.MutableLiveData&lt;String>" />
    </data>
...
    <TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
           android:layout_gravity="center_vertical"
           android:text="@{desc}" />
</layout>

我們可以直接將 LiveData 賦值給 text,然后綁定數據

val desc = MutableLiveData<String>()
binding.desc = desc

雙向綁定

單向綁定是指數據變化后更新 UI,而雙向綁定是指其中任意一個變化后都會同步更新到另一個。

雙向綁定使用 @={} 表達式來實現:

<data>
    ...
        <variable
            name="input"
            type="androidx.databinding.ObservableField&lt;String>" />
    </data>
...
<EditText
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="@={input}"/>

原文鏈接:https://blog.csdn.net/qq_35892584/article/details/126012838

欄目分類
最近更新