DataBinding 學(xué)習(xí)系列(4)DataBinding的高級(jí)功能

前言#

前幾篇已經(jīng)DataBinding的基礎(chǔ)用法已經(jīng)介紹的差不多了链方,所以接下來(lái)感受一下DataBinding強(qiáng)大的高級(jí)功能逾一。

正文#

DataBinding可以通過(guò)注解侦铜,實(shí)現(xiàn)很多強(qiáng)大的功能先鱼,并且十分的方便辟躏,能夠幫助我們省去大量的對(duì)xml進(jìn)行操作的代碼,例如加載圖片驯遇,字符串處理等等操作芹彬。

<h2>@BindingConversion 自定義類型轉(zhuǎn)換</h2>

<ImageView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@{@string/app_name}"/>
    
@BindingConversion
public static Drawable convertStringToDrawable(String str){
    return new ColorDrawable(Color.parseColor("#344567"));
}

分析上面的代碼,在xml中設(shè)置ImageView的背景是@{@string/app_name}叉庐,里面設(shè)置的竟然是字符串舒帮,如果是正常使用因?yàn)閷傩灶愋筒黄ヅ洌隙ㄊ且獔?bào)錯(cuò)的陡叠,但是利用了@BindingConversion玩郊,就可以幫助我們實(shí)現(xiàn)默認(rèn)的類型轉(zhuǎn)換。

從功能上看枉阵,我們需要把一個(gè)String類型轉(zhuǎn)換成Drawable類型译红,所以在任意的工具類中,創(chuàng)建一個(gè)以參數(shù)為String類型兴溜,返回值為Drawable類型的方法侦厚,最關(guān)鍵是的是別忘了@BindingConversion注解,幫助我們與DataBinding進(jìn)行綁定拙徽,DataBinding會(huì)自動(dòng)在綁定的方法中找到符合要求的方法進(jìn)行轉(zhuǎn)換刨沦。

<h2>自動(dòng)添加Setter方法</h2>

在定義對(duì)象(Bean)中,最常見的就是Setter和Getter方法膘怕,DataBinding可以幫助我們?yōu)樽远x屬性自動(dòng)設(shè)置Setter方法想诅。

首先,DataBinding一個(gè)不得不說(shuō)的強(qiáng)大之處淳蔼,不需要在styleable-declare中聲明就可以使用他需要的自定義屬性侧蘸,使用方法和平常的自定義屬性一樣,只需要在root標(biāo)簽中鹉梨,定義命名空間讳癌。

先看代碼:

<ImageView
    android:layout_width="200dp"
    android:layout_height="200dp"
    app:imageDrawable="@{@drawable/ic_launcher}"
    android:background="@{@string/app_name}"/>

在xml中使用了一個(gè)從來(lái)沒見過(guò)的imageDrawable屬性,但是不會(huì)報(bào)錯(cuò)存皂,運(yùn)行結(jié)果看圖:


這里寫圖片描述

ImageView顯示了@drawable/ic_launcher 對(duì)應(yīng)的圖片晌坤,這是為什么呢?

因?yàn)镈ataBinding會(huì)自動(dòng)為imageDrawable在ImageView中尋找對(duì)應(yīng)的setter方法旦袋,也就是setImageDrawable()骤菠,如果這個(gè)方法不存在肯定就要報(bào)錯(cuò)了。其他的屬性也可以通過(guò)同樣的方式來(lái)直接在xml中設(shè)置想要的屬性值疤孕。

<h2>重命名setter 方法 @BindingMethods</h2>

@BindingMethods({
@BindingMethod(type = "android.widget.ImageView",
attribute = "android:tint",
method = "setImageTintList"),
})

ImageView在xml 中的android:tint 屬性 和setImageTintList()是相對(duì)應(yīng)的商乎,但是在方法命名上并不是符合Setter的規(guī)則,這樣就可以利用@BindingMethods 來(lái)重命名對(duì)應(yīng)的setter方法祭阀。

特別注意鹉戚,這一句需要加載類的最上面鲜戒,在import 下面。

上面這個(gè)例子是系統(tǒng)自帶的抹凳,個(gè)人感覺實(shí)戰(zhàn)中可能接觸的并不多遏餐。

<h2>自定義setter方法@BindingAdapte</h2>

個(gè)人感覺這個(gè)功能應(yīng)該是用的最多的,通過(guò)@BindingAdapte就可以直接為自定義屬性定制自己的實(shí)現(xiàn)方法赢底。

<ImageView
    android:layout_width="200dp"
    android:layout_height="200dp"
    app:image="@{@drawable/ic_launcher}"
    android:background="@{@string/app_name}"/>

@BindingAdapter("bind:image")
public static void loadImage(ImageView image, Drawable resId){
    image.setImageDrawable(resId);
}

首先在工具類中創(chuàng)建一個(gè)setter方法失都,這個(gè)方法至少需要一個(gè)參數(shù),就是View本身幸冻,然后綁定自定義屬性粹庞。

上面的loadImage方法,綁定的是image屬性嘁扼,其中綁定的格式就是 “bind:xxx”, 如果要綁定多個(gè)屬性信粮,之間用英文的逗號(hào)隔開,例如@BindingAdapter("bind:image" , "bind:test" )趁啸,在xml如果需要使用這個(gè)方法直接在指定的View設(shè)置image屬性强缘。

<h2>設(shè)置View上屬性默認(rèn)值</h2>

大部分我們想在ide中預(yù)覽效果,例如看看textView的位置不傅,文字顏色大小等是否滿意旅掂,但是使用了DataBinding個(gè)就會(huì)變得不方便,所以DataBinding直接提供了設(shè)置默認(rèn)值的功能

<TextView android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:text="@{user.firstName, default=test}"/>

語(yǔ)法就是在完整的屬性值最后用英文的逗號(hào)隔開访娶, 加上default=xxxx, 注意這個(gè)默認(rèn)值是不能加上引號(hào)的商虐。

特別注意:經(jīng)過(guò)測(cè)試,目前DataBinding暫不支持使用@mipmap下的圖片崖疤。

總結(jié)#

介紹到這里秘车,DataBinding的各種功能的使用就算是圓滿的結(jié)束了,代碼也非常的簡(jiǎn)單劫哼,但是一定要自己親自在電腦上敲一敲才能感受到DataBinding的神奇叮趴。

下一篇準(zhǔn)備寫一寫還有哪些知識(shí)點(diǎn)沒有介紹到,再好好的深化一下概念权烧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末眯亦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子般码,更是在濱河造成了極大的恐慌妻率,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件板祝,死亡現(xiàn)場(chǎng)離奇詭異宫静,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門囊嘉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)温技,“玉大人,你說(shuō)我怎么就攤上這事扭粱。” “怎么了震檩?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵琢蛤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我抛虏,道長(zhǎng)博其,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任迂猴,我火速辦了婚禮慕淡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沸毁。我一直安慰自己峰髓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布息尺。 她就那樣靜靜地躺著携兵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搂誉。 梳的紋絲不亂的頭發(fā)上徐紧,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音炭懊,去河邊找鬼并级。 笑死,一個(gè)胖子當(dāng)著我的面吹牛侮腹,可吹牛的內(nèi)容都是我干的嘲碧。 我是一名探鬼主播,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼凯旋,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼呀潭!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起至非,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤钠署,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后荒椭,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谐鼎,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年趣惠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了狸棍。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片身害。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖草戈,靈堂內(nèi)的尸體忽然破棺而出塌鸯,到底是詐尸還是另有隱情,我是刑警寧澤唐片,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布丙猬,位于F島的核電站,受9級(jí)特大地震影響费韭,放射性物質(zhì)發(fā)生泄漏茧球。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一星持、第九天 我趴在偏房一處隱蔽的房頂上張望抢埋。 院中可真熱鬧,春花似錦督暂、人聲如沸揪垄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)福侈。三九已至,卻和暖如春卢未,著一層夾襖步出監(jiān)牢的瞬間肪凛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工辽社, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留伟墙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓滴铅,卻偏偏與公主長(zhǎng)得像戳葵,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子汉匙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

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