Android DataBinding (一) 基本用法
Android DataBinding (二) 事件處理
Android DataBinding (三) Observable
Android DataBinding (四) 自定義屬性 (本文)
Android DataBinding (五) 自定義 View 的雙向綁定
Android DataBinding (六) EditText 綁定 TextChangedListener 和 FocusChangeListener
前言
DataBinding 的時(shí)候股淡,會(huì)調(diào)用 View 的哪替,setXxx 方法。比如下面代碼
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}" />
綁定的時(shí)候会涎,會(huì)調(diào)用 setText(String text) 方法。
前提是 TextView 已經(jīng)有了 setText(String text) 方法婴氮,沒有 setText 方法舍咖,或者 setText 方法的方法簽名不一樣,都是不行的没龙。
所以,不是所有的屬性都能通過 DataBinding 來(lái)設(shè)置缎玫。
當(dāng)沒有方法的時(shí)候硬纤,有兩種做法
1. 如果有類似的方法,只是方法名或者方法簽名不一樣赃磨,可以通過設(shè)置來(lái)調(diào)用現(xiàn)有的方法筝家。
比如 android:onClick,View 中沒有 setOnClick 方法煞躬,但是有 setOnClickListener 方法肛鹏,而且方法簽名是一樣的。
這時(shí)候我們可以使用 BindingMethod 來(lái)做個(gè)中轉(zhuǎn)恩沛。
@BindingMethods({
@BindingMethod(type = View.class, attribute = "android:onClick", method = "setOnClickListener")
})
@BindingMethods 定義到類名上面在扰。
當(dāng)然,如果你僅僅是想重命名 setter雷客,也可以通過 @BindingAdapter 來(lái)實(shí)現(xiàn)芒珠。
比如 android:paddingLeft,View 中是沒有 setPaddingLeft 方法的搅裙,只有 setPadding 方法皱卓。
這時(shí)候可以自定義一個(gè) set 方法,并在方法上面添加 @BindingAdapter部逮。
@BindingAdapter("android:paddingLeft")
public static void setPaddingLeft(View view, int padding) {
view.setPadding(padding,
view.getPaddingTop(),
view.getPaddingRight(),
view.getPaddingBottom());
}
2. 沒有類似方法娜汁,添加對(duì)應(yīng)的方法。
比如 app:xxx 屬性
如果方法簽名就是 app:xxx 屬性里設(shè)定的值得話兄朋,直接定義 setXxx 方法即可掐禁。
如果方法簽名像上面的 setPaddingLeft 一樣,還需要把 View 自己也傳入的話颅和,那么除了要定義 setXxx 方法傅事,還需要添加 @BindingAdapter("android:xxx")
DataBinding Library 提供了一些自定義屬性
幸運(yùn)的是,有些常用的屬性峡扩,比如上面提到的 android:onClick 和 android:paddingLeft蹭越,Library 已經(jīng)幫你設(shè)置好了,自己不需要在設(shè)置就可以直接使用了教届。(具體可以參照android.databinding.adapters.ViewBindingAdapter)
多屬性綁定
同一個(gè)方法响鹃,可以同時(shí)設(shè)置多個(gè)屬性
@BindingAdapter({"bind:imageUrl", "bind:error"})
public static void loadImage(ImageView view, String url, Drawable error) {
Picasso.with(view.getContext()).load(url).error(error).into(view);
}
Picasso 讀取圖片同時(shí)需要 imageUrl 和 error驾霜。同時(shí)定義的時(shí)候才調(diào)用,缺一不可茴迁。
上面的例子是同時(shí)設(shè)定的時(shí)候才調(diào)用寄悯,如果是定義了其中某一個(gè)的時(shí)候就調(diào)用的話萤衰,只需要加個(gè) requireAll = false 就 OK 了堕义。
@BindingAdapter(value = {"android:onViewDetachedFromWindow", "android:onViewAttachedToWindow"},
requireAll = false)
public static void setOnAttachStateChangeListener(View view,
final OnViewDetachedFromWindow detach, final OnViewAttachedToWindow attach) {
}
setOnAttachStateChangeListener 在 android:onViewDetachedFromWindow 或者 android:onViewAttachedToWindow 其中之一調(diào)用的時(shí)候就調(diào)用。