data-binding 踩坑記

1. 如何向單個(gè)view傳遞多個(gè)binding參數(shù)

a. 在BindingAdapter中定義

@BindingAdapter({"position", "info"})
 public static void renderView(View view, int position, Info info) {
        view.renderView(position, info);
    }

b xml配置 position,info 屬性即可钞护。
這里點(diǎn)進(jìn)BindingAdapter可以看到兩個(gè)參數(shù):

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package android.databinding;

import java.lang.annotation.ElementType;
import java.lang.annotation.Target;

@Target({ElementType.METHOD})
public @interface BindingAdapter {
    String[] value();

    boolean requireAll() default true;
}

value 數(shù)組搓扯,binding的屬性,requireAll是 bool參數(shù) 表示是否可選座咆。

2 data- binding的一個(gè)bug:

當(dāng)為某個(gè)view設(shè)置layout_width 時(shí),使用官方的方法仓洼,binding一個(gè)dimen的資源會(huì)出現(xiàn)如下錯(cuò)誤

1F2145CA-80F9-4914-AF93-7DEF4FDDCD09.png

目前我看到的一個(gè)workaround如下:

 @BindingAdapter("height")
    public static void setHeight(View view, float height) {
        ViewGroup.LayoutParams params = view.getLayoutParams();
        params.height = (int) height;
        view.setLayoutParams(params);
    }

其實(shí)就是1.提到的方法介陶,但是我在實(shí)際使用的時(shí)候卻存在空指針異常,因?yàn)関iew.getLayoutParams()可能為空色建。
這里需要判空下哺呜。

3 binding 資源 :

  1. res:
    直接 在vm定義
public final ObservableField<Drawable> mDrawable = new ObservableField<>();

xml配置

android:drawableLeft="@{viewModel.mDrawable}"

4 binding 事件

vm中定義 回調(diào)即可

public final ObservableField<View.OnClickListener> mOnClickMoreView = new ObservableField<>();

5 binding參數(shù)順序問題

當(dāng)一個(gè)view出現(xiàn)多個(gè)參數(shù)時(shí),如果你不是使用BindingAdapter一起設(shè)置參數(shù)的話箕戳,而是分別設(shè)置的話某残,小心一下參數(shù)順序国撵,binding按照xml 順序讀取,也就是說玻墅,這個(gè)就存在一個(gè)優(yōu)先級(jí)介牙,后面的參數(shù)可能覆蓋一些前面的參數(shù)。

6 listView Click事件處理

工程較大時(shí)澳厢,我們有一個(gè)統(tǒng)一的ViewModel环础,恰好就是這個(gè)ViewModel,造成各種兼容問題剩拢。 比如我有一個(gè)需求线得,ViewGroup不攔截事件,而另外的同事需要攔截該事件徐伐。有人會(huì)說onclickbinding null就好贯钩,可行,但同事又binding了一個(gè)長(zhǎng)按事件onLongClick呵晨,ok魏保,還繼續(xù)這樣做。事實(shí)是然并卵摸屠。測(cè)試了下binding clickable谓罗,binding onLongClickable才可行。

7 binding include標(biāo)簽或merg標(biāo)簽

這里建議include 自己 binding一個(gè)ViewModel季二, 然后在include的父布局bind:ViewModel即可檩咱。

8 xml導(dǎo)入類,在data中添加類似如下即可

<import type="android.text.TextUtils"/>

9 note

listview復(fù)用的時(shí)候,小心綁定的屬性未恢復(fù)胯舷,造成復(fù)用錯(cuò)誤刻蚯。 最重要的事,編譯通不過時(shí)桑嘶,注意vm中屬性和xml的屬性值是否相同炊汹。

下圖是找不到對(duì)應(yīng)的Longclick錯(cuò)誤的事例。

nomethod.png

下面事例是沒有做兼容逃顶,因?yàn)閞elativelayout沒有對(duì)應(yīng)的height屬性的設(shè)置讨便。

noviewbindingadapter.png

一個(gè)小的tips:

ViewModel的好處就是復(fù)用性較高,缺點(diǎn)就是處理view之間互動(dòng)時(shí)會(huì)存在問題以政,比如在ViewModel怎么拿到一個(gè)view 并進(jìn)行動(dòng)畫操作
a 一個(gè)處理方式是由外部bingding獲取對(duì)應(yīng)的view然后傳入霸褒,然后做動(dòng)畫就好。
b 自定義一個(gè)ViewAdapter 這里比較局限性盈蛮,只能banding對(duì)應(yīng)的view废菱。

 @BindingAdapter("showLoading")
    public static void showLoading(FrameLoading frameLoading, boolean loading) {
        if (loading) {
            frameLoading.start();
        } else {
            frameLoading.stop();
        }
    }

c 當(dāng)我們使用系統(tǒng)view 的時(shí)候,如何binding呢,也就是我們采用部分binding的時(shí)候? 比如ActionBar殊轴?

            XXXBinding binding = DataBindingUtil.inflate(getLayoutInflater(), R.layout.xxxlayout, new RelativeLayout(this), false);
            binding.setViewModel(vm);
            actionBar.setCustomView(binding.getRoot());

又是如何找到對(duì)應(yīng)的binding呢衰倦?

 View customView = actionBar.getCustomView();
            XXXBinding binding = DataBindingUtil.findBinding(customView);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市梳凛,隨后出現(xiàn)的幾起案子耿币,更是在濱河造成了極大的恐慌梳杏,老刑警劉巖韧拒,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異十性,居然都是意外死亡叛溢,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門劲适,熙熙樓的掌柜王于貴愁眉苦臉地迎上來楷掉,“玉大人,你說我怎么就攤上這事霞势∨胫玻” “怎么了?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵愕贡,是天一觀的道長(zhǎng)草雕。 經(jīng)常有香客問我,道長(zhǎng)固以,這世上最難降的妖魔是什么墩虹? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮憨琳,結(jié)果婚禮上诫钓,老公的妹妹穿的比我還像新娘。我一直安慰自己篙螟,他們只是感情好菌湃,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著遍略,像睡著了一般惧所。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上墅冷,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天纯路,我揣著相機(jī)與錄音,去河邊找鬼寞忿。 笑死驰唬,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播叫编,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辖佣,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了搓逾?” 一聲冷哼從身側(cè)響起卷谈,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎霞篡,沒想到半個(gè)月后世蔗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡朗兵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年污淋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片余掖。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寸爆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出盐欺,到底是詐尸還是另有隱情赁豆,我是刑警寧澤,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布冗美,位于F島的核電站魔种,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏墩衙。R本人自食惡果不足惜务嫡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望漆改。 院中可真熱鬧心铃,春花似錦、人聲如沸挫剑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽樊破。三九已至愉棱,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間哲戚,已是汗流浹背奔滑。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留顺少,地道東北人朋其。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓王浴,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親梅猿。 傳聞我的和親對(duì)象是個(gè)殘疾皇子氓辣,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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