DataBinding其二

  1. xml布局文件
  2. 動(dòng)態(tài)設(shè)置變量
  3. 綁定適配器(BindingAdapter)

DataBinding其三

準(zhǔn)備開(kāi)始DataBinding系列的第二篇沮明,回顧第一篇殖蚕,DataBindig的入門(mén)和簡(jiǎn)單介紹了一下使用卵佛,足以應(yīng)付一部分開(kāi)發(fā)場(chǎng)景赘娄。學(xué)完該篇?jiǎng)t可以應(yīng)付開(kāi)發(fā)中大部分的場(chǎng)景般贼。

1限嫌、xml布局文件

在xml中可以使用res文件夾中的資源愁拭,基本上都可以通過(guò)常規(guī)的方式在綁定表達(dá)式中使用栓袖,比如:

<TextView 
    android:text=“@{@string/app_name}”/>

但有些卻需要顯示(不同常規(guī)的引用)調(diào)用:

1.1匣摘、String的使用

在表達(dá)式中使用String有多種方式:

  • 直接使用字面量
  • 使用string資源,(format效果)
  • 使用string資源裹刮,(富文本效果)

直接在表達(dá)式中使用字面量有兩種方式:

android:text=“@{`hello`}”//`該符號(hào)在Tab鍵上方
android:test=‘@{“hello”}’//這里是單引號(hào)

而當(dāng)我們?cè)趕tring資源中使用轉(zhuǎn)換符可以在表達(dá)式使用時(shí)得出和format一樣的效果:

<string name=“test”>hello %s</string>
—————————————————— 分割線 ————————
android:text=“@{@string/test(`wrold`)}” //hello wrold

用法和String的format一樣音榜。

最后就是實(shí)現(xiàn)一部分富文本的操作,比如顯示不同的字體顏色:

<string name="test">hello<Data><![CDATA[<font color="#F92F2F
">wrold</font>]]></Data></string>
—————————————————— 分割線 ————————
android:text=“@{html.fromHtml(@string/test)}”//wrold 將顯示紅色

其中使用到的html需要通過(guò)<import>標(biāo)簽導(dǎo)入捧弃。

1.2赠叼、xml中的運(yùn)算符

可以在表達(dá)式中使用的運(yùn)算符有很多,加上上面說(shuō)到的來(lái)個(gè)總結(jié):

  • 算術(shù)運(yùn)算符 + - / * %
  • 字符串連接運(yùn)算符 +
  • 邏輯運(yùn)算符 && ||
  • 二元運(yùn)算符 & | ^
  • 一元運(yùn)算符 + - ! ~
  • 移位運(yùn)算符 >> >>> <<
  • 比較運(yùn)算符 == > < >= <=(請(qǐng)注意违霞,< 需要轉(zhuǎn)義為 <)
  • instanceof
  • 分組運(yùn)算符 ()
  • 字面量運(yùn)算符 - 字符嘴办、字符串、數(shù)字买鸽、null
  • 類型轉(zhuǎn)換
  • 方法調(diào)用
  • 字段訪問(wèn)
  • 數(shù)組訪問(wèn) []
  • 三元運(yùn)算符 ?:
  • Null 合并運(yùn)算符 ??

特別說(shuō)明:Null合并運(yùn)算符是一個(gè)二元運(yùn)算符:

android:text=“@{demo??`def`}”
相當(dāng)于
android:text=“@{demo == null?def:demo}”

1.3涧郊、xml中隱藏的資源

你可以將<import>等效于java/kotlin的imort關(guān)鍵字

import關(guān)鍵字都知道,無(wú)論在java還是kotlin都是用來(lái)導(dǎo)入一些包的眼五,而有一個(gè)包是不用導(dǎo)入就可以使用的妆艘,那就是long包。<import>標(biāo)簽也是一樣的看幼。

所以在DataBinding的xml布局中批旺,你可以隨意使用long包的所有類的靜態(tài)方法,比如String.format诵姜、Math.abs等等朱沃。
那xml中總共隱藏哪些東西呢?

  • Context
  • Java.long.*
  • 布局中的控件

如何使用布局中的View茅诱?

使用布局中的View

可以看到直接通過(guò)id的名稱(名字如果是下劃線式逗物,需要轉(zhuǎn)換成駝峰式)即可聯(lián)想出Viewpager的方法,說(shuō)明已經(jīng)獲取到該viewPager對(duì)象了瑟俭。

1.4翎卓、<include>標(biāo)簽

DataBinding在include標(biāo)簽中也是可以使用的:

<include
    item="@{item}"
    android:id="@+id/stockDetail"
    layout="@layout/view_search_stock_item_detail"/>

view_search_stock_item_detail.xml

<data>

        <!——include的屬性名與variable的name一致——>
    <variable
        name="item" 
        type="com.jiucaigongshe.model.Stock" />

</data>

數(shù)據(jù)綁定不支持 include 作為 merge 元素的直接子元素

2、動(dòng)態(tài)設(shè)置變量

有時(shí)摆寄,會(huì)不知道特定綁定類失暴,但是仍然需要對(duì)這個(gè)綁定類設(shè)置一個(gè)特定(BR值對(duì)應(yīng)的變量)的值坯门,這是需要通過(guò)setVariable方法進(jìn)行動(dòng)態(tài)設(shè)置變量。大致是這樣的:

通過(guò)多態(tài)性逗扒,就可以不必知道特定的綁定類古戴,只需要是ViewDataBinding對(duì)象即可,第二矩肩,不需要知道變量是誰(shuí)现恼,我們可以通過(guò)BR值去規(guī)定變量。從而通過(guò)setVariable方法給不同的綁定類設(shè)置不同類型的變量黍檩,只需要這個(gè)變量的名稱都一樣就行叉袍。

舉一個(gè)沒(méi)有應(yīng)用場(chǎng)景的簡(jiǎn)單的例子:

另外一種數(shù)據(jù)設(shè)置方式

當(dāng)可變或可觀察對(duì)象發(fā)生更改時(shí),綁定會(huì)按照計(jì)劃在下一幀之前發(fā)生更改刽酱。但有
時(shí)必須立即執(zhí)行綁定喳逛。就需要使用executePendingBindings()

val bindingA = …;
Val bindingB = …;
bindData(bindingA,”數(shù)據(jù)”)
bindData(bindingB,12)

它是有應(yīng)用場(chǎng)景的棵里,比如RecyclerView結(jié)合DataBinding润文。

但是在定義方法的時(shí)候你會(huì)發(fā)現(xiàn),在我還沒(méi)有布局的時(shí)候殿怜,BR值也不存在转唉,所以data報(bào)錯(cuò)了。

這時(shí)我們可以通過(guò)@Bindable生成一個(gè)BR值:

使用@Bindable

3稳捆、綁定適配器(BindingAdapter)

BindingAdapter是dataBinding最重要的一個(gè)注解赠法,這個(gè)注解的作用就是創(chuàng)建可以使用綁定表達(dá)式的屬性,該注解有兩個(gè)參數(shù):

第一個(gè)是字符串可變參數(shù)乔夯,表示屬性名稱列表砖织;
第二個(gè)參數(shù)是requireAll,表示前面的屬性是否必須同時(shí)存在(默認(rèn)是true)

對(duì)于java末荐,該標(biāo)簽只有作用在靜態(tài)方法上才有作用侧纯,而對(duì)于kotlin,可以是靜態(tài)方法甲脏,也可以是頂級(jí)方法眶熬。

舉個(gè)例子:

@BindingAdapter(“app:deleteLine”,“app:underLine”块请,requireAll = false)
fun void setDelAndUnderLine(view:TextView,delLine:Boolean?,undLine:Boolean?){
//該方法用于設(shè)置下劃線和刪除線
//code..
}

可以看到delLineundLine參數(shù)都是可空的娜氏,這是因?yàn)?code>requireAll為false,這兩者不必同時(shí)存在墩新。如果requireAll為true贸弥,那么這兩者都必須在布局文件中同時(shí)使用,否則會(huì)報(bào)錯(cuò)海渊。

<TextView
    app:deleteLine=“@{true}”
    app:underLine=“@{true}”/>

這就是BindingAdapter的簡(jiǎn)單使用绵疲,通過(guò)它你可以創(chuàng)建許多本不存在的屬性哲鸳。

注意:命名空間并不一定需要。

再次注意:如果在kotlin中希望和java中一樣使用靜態(tài)方法盔憨,那么需要給方法加上@JvmStatic注解徙菠。

小結(jié)

DataBinding在xml中有常規(guī)的用法(使用字面量、資源文件夾中的資源)等等郁岩。
也有一些不在明面上的資源(context婿奔,xml布局中的控件等)

最后介紹了BindingAdapter注解的基本用法。

這是DataBinding系列的第二篇驯用,學(xué)完這篇已然算學(xué)會(huì)了Databinding脸秽,基本上可以應(yīng)付開(kāi)發(fā)中的各種問(wèn)題了儒老,在接下來(lái)的第三篇將著重介紹雙向綁定和DataBinding相關(guān)的注解蝴乔。敬請(qǐng)期待!驮樊!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末薇正,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子囚衔,更是在濱河造成了極大的恐慌挖腰,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件练湿,死亡現(xiàn)場(chǎng)離奇詭異猴仑,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)肥哎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)辽俗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人篡诽,你說(shuō)我怎么就攤上這事崖飘。” “怎么了杈女?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,764評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵朱浴,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我达椰,道長(zhǎng)翰蠢,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,193評(píng)論 1 292
  • 正文 為了忘掉前任啰劲,我火速辦了婚禮躏筏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘呈枉。我一直安慰自己趁尼,他們只是感情好埃碱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,216評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著酥泞,像睡著了一般砚殿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芝囤,一...
    開(kāi)封第一講書(shū)人閱讀 51,182評(píng)論 1 299
  • 那天似炎,我揣著相機(jī)與錄音,去河邊找鬼悯姊。 笑死羡藐,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的悯许。 我是一名探鬼主播仆嗦,決...
    沈念sama閱讀 40,063評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼先壕!你這毒婦竟也來(lái)了瘩扼?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,917評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤垃僚,失蹤者是張志新(化名)和其女友劉穎集绰,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體谆棺,經(jīng)...
    沈念sama閱讀 45,329評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡栽燕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,543評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了改淑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碍岔。...
    茶點(diǎn)故事閱讀 39,722評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖溅固,靈堂內(nèi)的尸體忽然破棺而出付秕,到底是詐尸還是另有隱情,我是刑警寧澤侍郭,帶...
    沈念sama閱讀 35,425評(píng)論 5 343
  • 正文 年R本政府宣布询吴,位于F島的核電站,受9級(jí)特大地震影響亮元,放射性物質(zhì)發(fā)生泄漏猛计。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,019評(píng)論 3 326
  • 文/蒙蒙 一爆捞、第九天 我趴在偏房一處隱蔽的房頂上張望奉瘤。 院中可真熱鬧,春花似錦、人聲如沸盗温。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,671評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)卖局。三九已至斧蜕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間砚偶,已是汗流浹背批销。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,825評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留染坯,地道東北人均芽。 一個(gè)月前我還...
    沈念sama閱讀 47,729評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像单鹿,于是被迫代替她去往敵國(guó)和親掀宋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,614評(píng)論 2 353

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