Android 學(xué)習(xí)日記----jetpack---androidx.dataBinding

Databinding概述:

數(shù)據(jù)綁定庫(kù)是一種支持庫(kù),借助該庫(kù),您可以使用聲明性格式(而非程序化地)將布局中的界面組件綁定到應(yīng)用中的數(shù)據(jù)源。

布局通常是使用調(diào)用界面框架方法的代碼在 Activity 中定義的。例如,以下代碼調(diào)用 findViewById() 來(lái)查找 TextView 微件并將其綁定到 viewModel 變量的 userName 屬性:

? ? findViewById<TextView>(R.id.sample_text).apply {

text

= viewModel.userName

}

以下示例展示了如何在布局文件中使用數(shù)據(jù)綁定庫(kù)將文本直接分配到微件。這樣就無(wú)需調(diào)用上述任何 Java 代碼。請(qǐng)注意賦值表達(dá)式中 @{} 語(yǔ)法的使用:

<TextViewandroid:text="@{viewmodel.userName}" />

借助布局文件中的綁定組件,您可以移除 Activity 中的許多界面框架調(diào)用,使其維護(hù)起來(lái)更簡(jiǎn)單、方便。還可以提高應(yīng)用性能,并且有助于防止內(nèi)存泄漏以及避免發(fā)生 Null 指針異常。

使用數(shù)據(jù)綁定庫(kù)

要了解如何在 Android 應(yīng)用中使用數(shù)據(jù)綁定庫(kù),請(qǐng)參閱以下頁(yè)面。

開(kāi)始使用

了解如何準(zhǔn)備開(kāi)發(fā)環(huán)境以使用數(shù)據(jù)綁定庫(kù),包括在 Android Studio 中支持?jǐn)?shù)據(jù)綁定代碼。

布局和綁定表達(dá)式

借助表達(dá)式語(yǔ)言,您可以編寫(xiě)將變量關(guān)聯(lián)到布局中的視圖的表達(dá)式。數(shù)據(jù)綁定庫(kù)會(huì)自動(dòng)生成將布局中的視圖與您的數(shù)據(jù)對(duì)象綁定所需的類(lèi)。該庫(kù)提供了可在布局中使用的導(dǎo)入、變量和包含等功能。

該庫(kù)的這些功能可與您的現(xiàn)有布局無(wú)縫地共存。例如,可以在表達(dá)式中使用的綁定變量在 data 元素(界面布局根元素的同級(jí))內(nèi)定義。這兩個(gè)元素都封裝在 layout 標(biāo)記中,如以下示例所示:

<layout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"><data><variablename="viewmodel"type="com.myapp.data.ViewModel" /></data><ConstraintLayout... /> <!-- UI layout's root element --></layout>

使用可觀察的數(shù)據(jù)對(duì)象

數(shù)據(jù)綁定庫(kù)提供了可讓您輕松地觀察數(shù)據(jù)更改情況的類(lèi)和方法。您不必操心在底層數(shù)據(jù)源發(fā)生更改時(shí)刷新界面。您可以將變量或其屬性設(shè)為可觀察。借助該庫(kù),您可以將對(duì)象、字段或集合設(shè)為可觀察。

生成的綁定類(lèi)

數(shù)據(jù)綁定庫(kù)可以生成用于訪問(wèn)布局變量和視圖的綁定類(lèi)。此頁(yè)面展示了如何使用和自定義所生成的綁定類(lèi)。

綁定適配器

每一個(gè)布局表達(dá)式都有一個(gè)對(duì)應(yīng)的綁定適配器,要求必須進(jìn)行框架調(diào)用來(lái)設(shè)置相應(yīng)的屬性或監(jiān)聽(tīng)器。例如,綁定適配器負(fù)責(zé)調(diào)用 setText() 方法來(lái)設(shè)置文本屬性,或者調(diào)用 setOnClickListener() 方法向點(diǎn)擊事件添加監(jiān)聽(tīng)器。最常擁的綁定適配器(例如針對(duì)本頁(yè)面的示例中使用的 android:text 屬性)可供您在 android.databinding.adapters 軟件包中使用。如需常用綁定適配器列表,請(qǐng)參閱適配器。您也可以按照以下示例所示創(chuàng)建自定義適配器:

? ? @BindingAdapter("app:goneUnless")fun goneUnless(view: View, visible: Boolean) {

view

.visibility = if (visible) View.VISIBLE else View.GONE

}

將布局視圖綁定到架構(gòu)組件

Android 支持庫(kù)包含架構(gòu)組件,您可以使用這些組件設(shè)計(jì)穩(wěn)健、可測(cè)試且易維護(hù)的應(yīng)用。您可以將架構(gòu)組件與數(shù)據(jù)綁定庫(kù)一起使用,以進(jìn)一步簡(jiǎn)化界面開(kāi)發(fā)。

雙向數(shù)據(jù)綁定

數(shù)據(jù)綁定庫(kù)支持雙向數(shù)據(jù)綁定。此類(lèi)綁定使用的表示法支持以下操作:接收對(duì)屬性的數(shù)據(jù)更改,同時(shí)監(jiān)聽(tīng)用戶對(duì)此屬性的更新。

當(dāng)然以上都是在谷歌開(kāi)發(fā)者官方網(wǎng)站都可以找到,需要的同學(xué)可以到官網(wǎng)查看谷歌官方傳送門(mén)

下面就開(kāi)始我門(mén)今天的示例操作:

首先我門(mén)的前期工作就是創(chuàng)建相應(yīng)的activity和viewModel以及布局文件,當(dāng)然這個(gè)和前面的將Livedata時(shí)候的文件基本相同,這里就不在做過(guò)多的說(shuō)明了,想要的同學(xué)可以看前面的文章,或者在文章結(jié)束的時(shí)候,我會(huì)給大家我的項(xiàng)目示例的GitHub地址,需要的同學(xué)可以下載。

首先來(lái)的我先將databinding在我門(mén)的項(xiàng)目中啟用,這很簡(jiǎn)單,只需要在我門(mén)的gradle中添加以下代碼就可以了

dataBinding{

? ? enabled=true

}

設(shè)置完成之后,我們同步gradle就可以使用dataBinding了。

首先來(lái)到布局文件,在布局文件中的最上面的有一個(gè)小黃色的燈泡,點(diǎn)擊燈泡,就可以看到一個(gè)轉(zhuǎn)換為databinding布局文件的提示;

轉(zhuǎn)換完成之后的布局文件樣式如下:


就會(huì)發(fā)現(xiàn)根布局文件變成了layout了,并多了一個(gè)data包裹的區(qū)域。

完成布局文件的轉(zhuǎn)換之后,來(lái)到activity中進(jìn)行dataBinding的綁定。綁定如下

public class DataBindActivity extends AppCompatActivity {

private DataBindingViewModel dataBindingViewModel;

//設(shè)置dataBinding

private ActivityDataBindBinding dataBindBinding;

? ? @Override

? ? protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

//綁定不布局文件

dataBindBinding=DataBindingUtil.setContentView(this,R.layout.activity_data_bind);

? ? ? ? dataBindingViewModel=new ViewModelProvider(this).get(DataBindingViewModel.class);

//綁定viewModel數(shù)據(jù)層,setData跟布局文件中的name=data相同

? ? dataBindBinding.setData(dataBindingViewModel);

//生命周期監(jiān)控

dataBindBinding.setLifecycleOwner(this);

? ? }

}

經(jīng)過(guò)綁定之后我門(mén)能夠發(fā)現(xiàn),比起之前activity中的代碼量少了很多,看起來(lái)更加的舒服了。

然后我到布局文件中進(jìn)行數(shù)據(jù)和點(diǎn)擊事件的綁定代碼如下:

<?xml version="1.0" encoding="utf-8"?>

<layout 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">

? ? ? ? name="data"

? ? ? ? type="com.example.jetpackdemo.dataBinding.DataBindingViewModel" />

? ? ? ? android:layout_width="match_parent"

? ? ? ? android:layout_height="match_parent"

? ? ? ? tools:context=".dataBinding.DataBindActivity">

? ? ? ? ? ? android:id="@+id/guideline"

? ? ? ? ? ? android:layout_width="wrap_content"

? ? ? ? ? ? android:layout_height="wrap_content"

? ? ? ? ? ? android:orientation="vertical"

? ? ? ? ? ? app:layout_constraintGuide_begin="205dp" />

? ? ? ? ? ? android:id="@+id/btn1"

? ? ? ? ? ? android:layout_width="wrap_content"

? ? ? ? ? ? android:layout_height="wrap_content"

? ? ? ? ? ? android:text="按鈕1"

? ? ? ? ? ? android:onClick="@{()->data.addTickadd1()}"

? ? ? ? ? ? app:layout_constraintBottom_toBottomOf="parent"

? ? ? ? ? ? app:layout_constraintEnd_toStartOf="@+id/guideline"

? ? ? ? ? ? app:layout_constraintStart_toStartOf="parent"

? ? ? ? ? ? app:layout_constraintTop_toTopOf="parent" />

? ? ? ? ? ? android:id="@+id/btn2"

? ? ? ? ? ? android:layout_width="wrap_content"

? ? ? ? ? ? android:layout_height="wrap_content"

? ? ? ? ? ? android:text="按鈕2"

? ? ? ? ? ? android:onClick="@{()->data.addTickadd2()}"

? ? ? ? ? ? app:layout_constraintBottom_toBottomOf="parent"

? ? ? ? ? ? app:layout_constraintEnd_toEndOf="parent"

? ? ? ? ? ? app:layout_constraintStart_toStartOf="@+id/guideline"

? ? ? ? ? ? app:layout_constraintTop_toTopOf="parent" />

? ? ? ? ? ? android:id="@+id/tv1"

? ? ? ? ? ? android:layout_width="wrap_content"

? ? ? ? ? ? android:layout_height="wrap_content"

? ? ? ? ? ? android:text="@{String.valueOf(data.tickadd1)}"

? ? ? ? ? ? app:layout_constraintBottom_toTopOf="@+id/btn1"

? ? ? ? ? ? app:layout_constraintEnd_toStartOf="@+id/guideline"

? ? ? ? ? ? app:layout_constraintStart_toStartOf="parent"

? ? ? ? ? ? app:layout_constraintTop_toTopOf="parent" />

? ? ? ? ? ? android:id="@+id/tv2"

? ? ? ? ? ? android:layout_width="47dp"

? ? ? ? ? ? android:layout_height="19dp"

? ? ? ? ? ? android:text="@{String.valueOf(data.tickadd2)}"

? ? ? ? ? ? app:layout_constraintBottom_toTopOf="@+id/btn2"

? ? ? ? ? ? app:layout_constraintEnd_toEndOf="parent"

? ? ? ? ? ? app:layout_constraintStart_toStartOf="@+id/guideline"

? ? ? ? ? ? app:layout_constraintTop_toTopOf="parent" />

</layout>

到這里基本就完成了數(shù)據(jù)的雙向綁定了,接下來(lái)看看效果吧!


可以看到實(shí)現(xiàn)了我們的目的。

下面是本項(xiàng)目的GitHub地址

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評(píng)論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,860評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事?!?“怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 177,128評(píng)論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 63,291評(píng)論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,025評(píng)論 6 410
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 55,421評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,642評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,177評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,970評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,157評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,410評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,821評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 36,053評(píng)論 1 289
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,896評(píng)論 3 395
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,157評(píng)論 2 375