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ò)誤
目前我看到的一個(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 資源 :
- 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ò)誤的事例。
下面事例是沒有做兼容逃顶,因?yàn)閞elativelayout沒有對(duì)應(yīng)的height屬性的設(shè)置讨便。
一個(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);