- xml布局文件
- 動(dòng)態(tài)設(shè)置變量
- 綁定適配器(BindingAdapter)
準(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茅诱?
可以看到直接通過(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)單的例子:
當(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值:
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..
}
可以看到delLine
和undLine
參數(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)期待!驮樊!