Android?JetPack組件的支持庫(kù)Databinding詳解
簡(jiǎn)介
DataBinding 是 Google 在 Jetpack 中推出的一款數(shù)據(jù)綁定的支持庫(kù),利用該庫(kù)可以實(shí)現(xiàn)在頁(yè)面組件中直接綁定應(yīng)用程序的數(shù)據(jù)源。使其維護(hù)起來(lái)更加方便,架構(gòu)更明確簡(jiǎn)介。
DataBinding 唯一的作用,也是他的使命,就是綁定數(shù)據(jù),以及所有的支持庫(kù),本質(zhì)上都是為了支持這個(gè)功能。綁定一詞有兩種解釋?zhuān)谝皇菍?shù)據(jù)綁定在 UI 元素;第二是將 UI 上的數(shù)據(jù)綁定到對(duì)應(yīng)的數(shù)據(jù)模型,還支持對(duì)數(shù)據(jù)及 UI 的變動(dòng)觀察,其中一個(gè)發(fā)生變動(dòng)就需要同步到另一個(gè)上去。
啟用databinding
首先設(shè)置使用 Databinding,在 app module 的 build.gradle 中添加如下代碼即可:
android {
...
dataBinding {
enabled = true
}
}
布局xml
根結(jié)點(diǎn)必須為<layout>,只能存在一個(gè)<data>和一個(gè)直接子View結(jié)點(diǎn)。
variable (變量標(biāo)簽)
變量的屬性名name不能包含_下劃線(xiàn),否則再kt文件里會(huì)找不到變量,有時(shí)可能需要指定自定義類(lèi)型,可以使用 import 語(yǔ)法來(lái)導(dǎo)入類(lèi),以及使用 alias 設(shè)置別名
<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>當(dāng)需要使用兩個(gè)同名但不同包名的類(lèi),可以使用alias別名屬性
data (數(shù)據(jù)標(biāo)簽)
它有個(gè)屬性class,可以自定義DataBinding生成的類(lèi)名及路徑
<data class="ObservableDataBinding"> </data>
@{}表達(dá)式
運(yùn)算符
| 運(yùn)算類(lèi)型 | 運(yùn)算符 |
|---|---|
| 算術(shù)運(yùn)算符 | + - / * % |
| 字符串連接運(yùn)算符 | + |
| 邏輯運(yùn)算符 | && |
| 二元運(yùn)算符 | & |
| 一元運(yùn)算符 | + - ! ~ |
| 移位運(yùn)算符 | >> >>> << |
| 三元運(yùn)算符 | == > < >= <= |
| 分組運(yùn)算符 | () |
關(guān)鍵字
instanceof
字符、字符串、數(shù)字、null
類(lèi)型轉(zhuǎn)換
方法調(diào)用
字段訪(fǎng)問(wèn)
數(shù)組訪(fǎng)問(wèn) []
綁定普通數(shù)據(jù)
DataBinding 可以綁定普通數(shù)據(jù)對(duì)象(非 Observable/LiveData)
<data>
<import type="java.lang.String"/>
<variable name="content" type="String" />
</data>
綁定可觀察數(shù)據(jù)
綁定可觀察數(shù)據(jù)意味著當(dāng)數(shù)據(jù)變化時(shí) UI 會(huì)跟著一起變化,綁定可觀察數(shù)據(jù)有三種方式:objects、fields 和 collections.
對(duì)單個(gè)變量的綁定-fields
對(duì)于一些數(shù)據(jù)類(lèi)只需要其中幾個(gè)字段支持可觀察,那么可以使用這種方式來(lái)創(chuàng)建可觀察數(shù)據(jù)
data class User(
val name: ObservableField<String>,
val likes: ObservableInt
)
基本數(shù)據(jù)類(lèi)型直接使用對(duì)應(yīng)的包裝類(lèi)
| 基本數(shù)據(jù)類(lèi)型 | 包裝類(lèi) |
|---|---|
| boolean | ObservableBoolean |
| byte | ObservableByte |
| char | ObservableChar |
| short | ObservableShort |
| int | ObservableInt |
| long | ObservableLong |
| float | ObservableFloat |
| double | ObservableDouble |
引用類(lèi)型使用帶有泛型參數(shù)的 ObservableField 類(lèi)來(lái)創(chuàng)建
val name: ObservableField<String>
對(duì)集合的綁定-collections
<data>
<import type="android.databinding.ObservableList"/>
<variable name="user" type="ObservableList<Object>"/>
</data>
<TextView android:text="@{user[index]}" ... />
可以直接使用 [] 運(yùn)算符( list[0] )獲取對(duì)應(yīng)位置的元素
綁定對(duì)象-objects
需要綁定的數(shù)據(jù)實(shí)體類(lèi)繼承 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)
}
}需要支持可觀察的數(shù)據(jù)上添加 @get:Bindable 注解,然后重寫(xiě) set 方法,在其中調(diào)用 notifyPropertyChanged 方法表示更新該數(shù)據(jù),BR 是自動(dòng)生成的,包名跟當(dāng)前包名一致,會(huì)根據(jù) Bindable 注解的變量生成對(duì)應(yīng)的值;也可以調(diào)用 notifyChange() 方法更新所有數(shù)據(jù)
綁定LiveData
LiveData也支持?jǐn)?shù)據(jù)綁定
<?xml version="1.0" encoding="utf-8"?>
<layout>
<data>
<variable name="desc"
type="androidx.lifecycle.MutableLiveData<String>" />
</data>
...
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:text="@{desc}" />
</layout>我們可以直接將 LiveData 賦值給 text,然后綁定數(shù)據(jù)
val desc = MutableLiveData<String>() binding.desc = desc
雙向綁定
單向綁定是指數(shù)據(jù)變化后更新 UI,而雙向綁定是指其中任意一個(gè)變化后都會(huì)同步更新到另一個(gè)。
雙向綁定使用 @={} 表達(dá)式來(lái)實(shí)現(xiàn):
<data>
...
<variable
name="input"
type="androidx.databinding.ObservableField<String>" />
</data>
...
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@={input}"/>到此這篇關(guān)于Android JetPack組件的支持庫(kù)Databinding詳解的文章就介紹到這了,更多相關(guān)Android JetPack組件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android實(shí)現(xiàn)簡(jiǎn)單時(shí)鐘View的方法
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)簡(jiǎn)單的時(shí)鐘View,關(guān)鍵點(diǎn)在Canvas的平移與旋轉(zhuǎn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-08-08
Android仿簡(jiǎn)書(shū)長(zhǎng)按文章生成圖片效果
使用簡(jiǎn)書(shū)APP的同學(xué)都知道,簡(jiǎn)書(shū)有這樣一個(gè)功能;文章頁(yè)長(zhǎng)按內(nèi)容時(shí)底部會(huì)出現(xiàn)一個(gè) 生成圖片分享 的按鈕,點(diǎn)擊之后就可以將當(dāng)前的文章生成一張長(zhǎng)圖片;這張圖片可以保存到本地或分享給好友,同時(shí)還可為圖片設(shè)置成為白和黑兩種風(fēng)格,很有藝術(shù)范2017-03-03
Android WebView交互傳遞json字符串并解析的方法
這篇文章主要給大家介紹了關(guān)于Android中WebView交互傳遞json字符串并解析的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位Android開(kāi)發(fā)者具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-05-05
Android復(fù)選框CheckBox與開(kāi)關(guān)按鈕Switch及單選按鈕RadioButton使用示例詳解
這篇文章主要介紹了Android復(fù)選框CheckBox與開(kāi)關(guān)按鈕Switch及單選按鈕RadioButton使用示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-09-09
Android okhttputils現(xiàn)在進(jìn)度顯示實(shí)例代碼
本文通過(guò)實(shí)例代碼給大家詳細(xì)介紹了Android okhttputils現(xiàn)在進(jìn)度顯示,代碼簡(jiǎn)答易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友參考下吧2016-12-12
Android 使用Vitamio打造自己的萬(wàn)能播放器(9)—— 在線(xiàn)播放 (在線(xiàn)電視)
本文主要介紹Android 使用Vitamio開(kāi)發(fā)播放器,實(shí)現(xiàn)在線(xiàn)電視播放,這里提供效果圖和實(shí)例代碼以便大家參考,2016-07-07
Android 5.0最應(yīng)該實(shí)現(xiàn)的8個(gè)期望
毫無(wú)疑問(wèn),Android 5 將是令人興奮的操作系統(tǒng),因?yàn)?Android4.0 至 4.4 版本之間并沒(méi)有顯著的差異,顯然谷歌會(huì)在 5.0 版本中進(jìn)行一些較大幅度的革新2016-01-01
Android仿天天動(dòng)聽(tīng)歌曲自動(dòng)滾動(dòng)view
這篇文章主要為大家詳細(xì)介紹了Android仿天天動(dòng)聽(tīng)歌曲自動(dòng)滾動(dòng)view的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-05-05
Android端使用Modbus協(xié)議的簡(jiǎn)單方法
Modbus協(xié)議是全球第一個(gè)用于工業(yè)現(xiàn)場(chǎng)的總線(xiàn)協(xié)議,與外設(shè)交互可以采用串口通信,tcp等方式,這篇文章主要給大家介紹了關(guān)于Android端使用Modbus協(xié)議的簡(jiǎn)單方法,需要的朋友可以參考下2021-11-11
Android實(shí)現(xiàn)城市選擇三級(jí)聯(lián)動(dòng)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)城市選擇三級(jí)聯(lián)動(dòng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-12-12

