DataBinding(三)事件處理

DataBinding可以在XML中使用事件的回調(diào)方法名作為屬性名(大部分情況下)來(lái)處理View分發(fā)的事件。比如說(shuō)View.OnLongClickListener的回調(diào)方法是onLongClick俄占,所以這個(gè)事件的屬性名稱就是android:onLongClick舶赔。

事件的處理可以有兩種方式:

  1. 方法引用:在事件屬性的表達(dá)式中調(diào)用一個(gè)方法,這個(gè)方法的簽名必須和事件回調(diào)方法簽名一致。當(dāng)事件回調(diào)發(fā)生時(shí)污茵,就會(huì)去轉(zhuǎn)而調(diào)用傳入的這個(gè)方法。如果事件表達(dá)式為空葬项,則只會(huì)給目標(biāo)view的事件回調(diào)設(shè)置一個(gè)空的監(jiān)聽器泞当。
  2. 監(jiān)聽器綁定:屬性值表達(dá)式是一個(gè)lambda表達(dá)式,總會(huì)創(chuàng)建一個(gè)監(jiān)聽器來(lái)設(shè)置到目標(biāo)view上民珍,事件發(fā)生的時(shí)候才會(huì)執(zhí)行這個(gè)表達(dá)式零蓉。

這兩種方式的主要區(qū)別是方法引用在綁定時(shí)就已經(jīng)給view設(shè)置了相對(duì)應(yīng)的監(jiān)聽了,而監(jiān)聽器綁定是方法觸發(fā)時(shí)才會(huì)去執(zhí)行表達(dá)式設(shè)置監(jiān)聽穷缤。

1. 方法引用

android:onClick可以直接引用一個(gè)Activity中聲明的方法一樣敌蜂,事件也可以直接綁定到某個(gè)類的方法中,注意所綁定方法的參數(shù)必須與事件方法參數(shù)一致津肛,同時(shí)返回值也必須一致章喉。與View#onClick屬性相比,這種方式的優(yōu)點(diǎn)在于如果未設(shè)置相應(yīng)回調(diào)方法身坐,則編譯期就會(huì)報(bào)錯(cuò)秸脱,不會(huì)等到運(yùn)行時(shí)報(bào)錯(cuò)崩潰。使用示例:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
   <data>
       <variable name="handlers" type="com.example.MainActivity"/>
       <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>
public class MainAcivity extends Activity {
    public void onClickFriend(View view) { ... }
}

調(diào)用語(yǔ)法可以是@{handlers::onClickFriend}或者@{handlers.onClickFriend}部蛇。

2. 監(jiān)聽器綁定

事件發(fā)生時(shí)才會(huì)執(zhí)行屬性值里的表達(dá)式摊唇。跟方法引用不同的是,表達(dá)式內(nèi)可以寫任意的DataBinding表達(dá)式涯鲁。而且監(jiān)聽器綁定可以定義不同的參數(shù)類型巷查,只要表達(dá)式返回值與事件方法返回值一致就可以了,如果事件方法返回值是空抹腿,表達(dá)式可以不用返回岛请。

監(jiān)聽器綁定的格式如下:

public class Presenter {
    public void onSaveClick(Task task){}
}

<!-- XML -->
 <?xml version="1.0" encoding="utf-8"?>
 <layout xmlns:android="http://schemas.android.com/apk/res/android">
     <data>
         <variable name="task" type="com.android.example.Task" />
         <variable name="presenter" type="com.android.example.Presenter" />
     </data>
     <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent">
         <Button android:layout_width="wrap_content" android:layout_height="wrap_content"
         android:onClick="@{() -> presenter.onSaveClick(task)}" />
     </LinearLayout>
 </layout>

使用的是lambda表達(dá)式,并且lambda表達(dá)式必須是表達(dá)式的最外層警绩。

上述格式中我們省略了onClick的參數(shù)View崇败,監(jiān)聽器綁定中可以省略所有或者列出所有監(jiān)聽器的參數(shù)。列出所有參數(shù)的格式如下:

 android:onClick="@{(view) -> presenter.onSaveClick(task)}"

聲明了參數(shù)之后就可以在表達(dá)式中使用:

public class Presenter {
    public void onSaveClick(View view, Task task){}
}

<!-- XML -->
  android:onClick="@{(theView) -> presenter.onSaveClick(theView, task)}"

Lambda表達(dá)式多個(gè)參數(shù)的示例:

 <CheckBox 
        android:layout_width="wrap_content" android:layout_height="wrap_content"
        android:onCheckedChanged="@{(cb, isChecked) -> presenter.completeChanged(task, isChecked)}" />

注意監(jiān)聽器綁定的返回值必須與回調(diào)方法返回值一致肩祥,例如:

public class Presenter {
    public boolean onLongClick(View view, Task task){}
}

<!-- XML -->
 android:onLongClick="@{(theView) -> presenter.onLongClick(theView, task)}"

假如監(jiān)聽器方法返回null后室,則會(huì)為回調(diào)方法返回其返回值的默認(rèn)值。

另外可以在lambda表達(dá)式中可以使用void:

 android:onClick="@{(v) -> v.isVisible() ? doSomething() : void}"
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末混狠,一起剝皮案震驚了整個(gè)濱河市岸霹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌檀蹋,老刑警劉巖松申,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件云芦,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡贸桶,警方通過(guò)查閱死者的電腦和手機(jī)舅逸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)皇筛,“玉大人琉历,你說(shuō)我怎么就攤上這事∷祝” “怎么了旗笔?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)拄踪。 經(jīng)常有香客問(wèn)我蝇恶,道長(zhǎng),這世上最難降的妖魔是什么惶桐? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任撮弧,我火速辦了婚禮,結(jié)果婚禮上姚糊,老公的妹妹穿的比我還像新娘贿衍。我一直安慰自己,他們只是感情好救恨,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布贸辈。 她就那樣靜靜地躺著,像睡著了一般肠槽。 火紅的嫁衣襯著肌膚如雪擎淤。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天署浩,我揣著相機(jī)與錄音揉燃,去河邊找鬼。 笑死筋栋,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的正驻。 我是一名探鬼主播弊攘,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼姑曙!你這毒婦竟也來(lái)了襟交?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤伤靠,失蹤者是張志新(化名)和其女友劉穎捣域,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焕梅,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年迹鹅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贞言。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡斜棚,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出该窗,到底是詐尸還是另有隱情弟蚀,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布酗失,位于F島的核電站义钉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏规肴。R本人自食惡果不足惜断医,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奏纪。 院中可真熱鬧鉴嗤,春花似錦、人聲如沸序调。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)发绢。三九已至硬耍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間边酒,已是汗流浹背经柴。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留墩朦,地道東北人坯认。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像氓涣,于是被迫代替她去往敵國(guó)和親牛哺。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

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