EP14-DataBinding(2)

事件綁定

Method References

事件可以被直接綁定到handler迫横,類似于Activity中onClick可以被指派給一個(gè)方法。相比View#onClick的一個(gè)優(yōu)勢(shì)是贫橙,這個(gè)表達(dá)式會(huì)在編譯時(shí)被處理,所以如果方法不存在或者簽名不對(duì)反粥,或編譯錯(cuò)誤卢肃。

Method References和Listener Bindings的一個(gè)主要區(qū)別是,前者的listener的真正實(shí)現(xiàn)是在data被綁定的時(shí)候才顿,而不是事件被觸發(fā)的時(shí)候莫湘。如果想在事件發(fā)生時(shí)評(píng)估表達(dá)式,請(qǐng)用listener binding娜膘。

分配event給handler逊脯,使用一個(gè)正常的binding表達(dá)式,它的值就是被調(diào)用的方法名竣贪。例如,if your data object has two methods:

public class MyHandlers {
    public void onClickFriend(View view) { ... }
}

binding表達(dá)式可以分配click listener到一個(gè)View:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="handlers" type="com.example.Handlers"/>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <TextView android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:text="@{user.firstName}"
           android:onClick="@{handlers::onClickFriend}"/>
   </LinearLayout>
</layout>

注意军洼,表達(dá)式(expression)中的方法的簽名(signature)必須和Listener Object中的方法的簽名完全一致。

Listener Bindings

Listener Bindings使用更為靈活演怎,跟Method References類似匕争,但可以讓你運(yùn)行隨意的data binding表達(dá)式碟联。這里不介紹了右核。

Layout的細(xì)節(jié)

1. Imports

在data節(jié)點(diǎn)中這樣添加引用:

<data>
    <import type="android.view.View"/>
</data>

這樣,你可以在binding表達(dá)式中使用View了:

<TextView
   android:text="@{user.lastName}"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:visibility="@{user.isAdult ? View.VISIBLE : View.GONE}"/>

類名沖突的時(shí)候撵割,可以取別名(alias):

<import type="android.view.View"/>
<import type="com.example.real.estate.View"
        alias="Vista"/>

variables和表達(dá)式的type references中都可以用引用的type:

<data>
    <import type="com.example.User"/>
    <import type="java.util.List"/>
    <variable name="user" type="User"/>
    <variable name="userList" type="List<User>"/>
 </data>

在表達(dá)式中引用靜態(tài)field和方法的時(shí)候也能使用引用的type:

<data>
    <import type="com.example.MyStringUtils"/>
    <variable name="user" type="com.example.User"/>
</data>
…
<TextView
   android:text="@{MyStringUtils.capitalize(user.lastName)}"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"/>

跟Java中一樣歹叮,java.lang.*這種類會(huì)被自動(dòng)導(dǎo)入跑杭。

2. Variables

這里涉及到實(shí)現(xiàn)Observable或observable collection的問(wèn)題,暫時(shí)調(diào)過(guò)咆耿。

3. 自定義Binding類名稱

默認(rèn)情況下會(huì)根據(jù)layout文件生成一個(gè)Binding類德谅,放置在包名根目錄下。
也可以通過(guò)在data節(jié)點(diǎn)加入路徑和Binding類名來(lái)自定義:

<data class="com.example.ContactItem">
    ...
</data>

4. Includes

Variables may be passed into an included layout's binding from the containing layout by using the application namespace and the variable name in an attribute:
通過(guò)使用application namespace和variable name萨螺,可以把變量傳遞給一個(gè)被包含的layout里面窄做。

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:bind="http://schemas.android.com/apk/res-auto">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <LinearLayout
       android:orientation="vertical"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
       <include layout="@layout/name"
           bind:user="@{user}"/>
       <include layout="@layout/contact"
           bind:user="@{user}"/>
   </LinearLayout>
</layout>

這里,name.xml和contact.xml里面必須要有user variable慰技。
Data Binding不支持include merge 元素的直接child椭盏,下面這樣是不行的

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:bind="http://schemas.android.com/apk/res-auto">
   <data>
       <variable name="user" type="com.example.User"/>
   </data>
   <merge>
       <include layout="@layout/name"
           bind:user="@{user}"/>
       <include layout="@layout/contact"
           bind:user="@{user}"/>
   </merge>
</layout>

5. 表達(dá)式

通用特性:
  • Mathematical + - / * %
  • String concatenation +
  • Logical && ||
  • Binary & | ^
  • Unary + - ! ~
  • Shift >> >>> <<(移位 )
  • Comparison == > < >= <=
  • instanceof
  • Grouping ()
  • Literals - character, String, numeric, null
  • Cast
  • Method calls(方法調(diào)用)
  • Field access
  • Array access []
  • Ternary operator(三元運(yùn)算) ?:

e.g.

android:text="@{String.valueOf(index + 1)}"
android:visibility="@{age < 13 ? View.GONE : View.VISIBLE}"
android:transitionName='@{"image_" + id}'
缺少的:

有些Java中能用的操作,在表達(dá)式函數(shù)中不能用:

  • this
  • super
  • new
  • Explicit generic invocatio
Null Coalescing 操作:

如果是null吻商,選左邊掏颊;不是,選右邊

android:text="@{user.displayName ?? user.lastName}"

等價(jià)于:

android:text="@{user.displayName != null ? user.displayName : user.lastName}"
Property Reference:

使用這樣的格式引用類的properties艾帐、fields乌叶、getters和ObservableFields:

android:text="@{user.lastName}"
避免 NullPointerException

Data Binding代碼生成時(shí)會(huì)自動(dòng)檢查null改化,如果存在null,會(huì)為對(duì)象賦默認(rèn)值枉昏。

集合

常見(jiàn)的有 arrays, lists, sparse lists, and maps;為了簡(jiǎn)便揍鸟,可以使用[]來(lái)調(diào)用兄裂。

<data>
    <import type="android.util.SparseArray"/>
    <import type="java.util.Map"/>
    <import type="java.util.List"/>
    <variable name="list" type="List&lt;String&gt;"/>
    <variable name="sparse" type="SparseArray&lt;String&gt;"/>
    <variable name="map" type="Map&lt;String, String&gt;"/>
    <variable name="index" type="int"/>
    <variable name="key" type="String"/>
</data>
…
android:text="@{list[index]}"
…
android:text="@{sparse[index]}"
…
android:text="@{map[key]}"
字符串

這樣用:

android:text='@{map["firstName"]}'

或者這樣:

android:text="@{map[`firstName`}"
android:text="@{map['firstName']}"
資源

簡(jiǎn)單的例子:

android:padding="@{large? @dimen/largePadding : @dimen/smallPadding}"

6. Data 對(duì)象

任何POJO都可用于Data Binding。修改POJO不會(huì)導(dǎo)致UI更新阳藻。data binding真正的力量在于晰奖,讓你的data objects對(duì)data changes有notify的能力。有三種數(shù)據(jù)變化通知機(jī)制:

  • observable objects
  • observable fields
  • observable collections

更多請(qǐng)看:https://developer.android.com/topic/libraries/data-binding/index.html#listener_bindings

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末腥泥,一起剝皮案震驚了整個(gè)濱河市匾南,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌蛔外,老刑警劉巖蛆楞,帶你破解...
    沈念sama閱讀 218,607評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異夹厌,居然都是意外死亡豹爹,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門矛纹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)臂聋,“玉大人,你說(shuō)我怎么就攤上這事或南『⒌龋” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵采够,是天一觀的道長(zhǎng)肄方。 經(jīng)常有香客問(wèn)我,道長(zhǎng)吁恍,這世上最難降的妖魔是什么扒秸? 我笑而不...
    開封第一講書人閱讀 58,750評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮冀瓦,結(jié)果婚禮上伴奥,老公的妹妹穿的比我還像新娘。我一直安慰自己翼闽,他們只是感情好拾徙,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,764評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著感局,像睡著了一般尼啡。 火紅的嫁衣襯著肌膚如雪暂衡。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,604評(píng)論 1 305
  • 那天崖瞭,我揣著相機(jī)與錄音狂巢,去河邊找鬼。 笑死书聚,一個(gè)胖子當(dāng)著我的面吹牛唧领,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播雌续,決...
    沈念sama閱讀 40,347評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼斩个,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了驯杜?” 一聲冷哼從身側(cè)響起受啥,我...
    開封第一講書人閱讀 39,253評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸽心,沒(méi)想到半個(gè)月后滚局,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,702評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡再悼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,893評(píng)論 3 336
  • 正文 我和宋清朗相戀三年核畴,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冲九。...
    茶點(diǎn)故事閱讀 40,015評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谤草,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出莺奸,到底是詐尸還是另有隱情丑孩,我是刑警寧澤,帶...
    沈念sama閱讀 35,734評(píng)論 5 346
  • 正文 年R本政府宣布灭贷,位于F島的核電站温学,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏甚疟。R本人自食惡果不足惜仗岖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,352評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望览妖。 院中可真熱鬧轧拄,春花似錦、人聲如沸讽膏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至俐末,卻和暖如春料按,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背卓箫。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工载矿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人烹卒。 一個(gè)月前我還...
    沈念sama閱讀 48,216評(píng)論 3 371
  • 正文 我出身青樓恢准,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親甫题。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,969評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容