安卓DataBinding (四) 自定义属性

Android DataBinding (一) 基本用法 
Android DataBinding (二) 事件处理 
Android DataBinding (三) Observable 
Android DataBinding (四) 自定义属性 (本文) 
Android DataBinding (五) 自定义 View 的双向绑定 
Android DataBinding (六) EditText 绑定 TextChangedListener 和 FocusChangeListener

前言

DataBinding 的时候,会调用 View 的,setXxx 方法。比如下面代码

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@{user.name}" />

绑定的时候,会调用 setText(String text) 方法。 
前提是 TextView 已经有了 setText(String text) 方法,没有 setText 方法,或者 setText 方法的方法签名不一样,都是不行的。 
所以,不是所有的属性都能通过 DataBinding 来设置。

当没有方法的时候,有两种做法

1. 如果有类似的方法,只是方法名或者方法签名不一样,可以通过设置来调用现有的方法。

比如 android:onClick,View 中没有 setOnClick 方法,但是有 setOnClickListener 方法,而且方法签名是一样的。 
这时候我们可以使用 BindingMethod 来做个中转。

@BindingMethods({
        @BindingMethod(type = View.class, attribute = "android:onClick", method = "setOnClickListener")
})

@BindingMethods 定义到类名上面。 
当然,如果你仅仅是想重命名 setter,也可以通过 @BindingMethods 来实现。

比如 android:paddingLeft,View 中是没有 setPaddingLeft 方法的,只有 setPadding 方法。 
这时候可以自定义一个 set 方法,并在方法上面添加 @BindingAdapter。

@BindingAdapter("android:paddingLeft")
public static void setPaddingLeft(View view, int padding) {
   view.setPadding(padding,
                   view.getPaddingTop(),
                   view.getPaddingRight(),
                   view.getPaddingBottom());
}

2. 没有类似方法,添加对应的方法。 
比如 app:xxx 属性 
如果方法签名就是 app:xxx 属性里设定的值得话,直接定义 setXxx 方法即可。 
如果方法签名像上面的 setPaddingLeft 一样,还需要把 View 自己也传入的话,那么除了要定义 setXxx 方法,还需要添加 @BindingAdapter(“android:xxx”)

DataBinding Library 提供了一些自定义属性

幸运的是,有些常用的属性,比如上面提到的 android:onClick 和 android:paddingLeft,Library 已经帮你设置好了,自己不需要在设置就可以直接使用了。(具体可以参照android.databinding.adapters.ViewBindingAdapter)

多属性绑定

同一个方法,可以同时设置多个属性

@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 读取图片同时需要 imageUrl 和 error。同时定义的时候才调用,缺一不可。

上面的例子是同时设定的时候才调用,如果是定义了其中某一个的时候就调用的话,只需要加个 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 其中之一调用的时候就调用。

发布了24 篇原创文章 · 获赞 5 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_26923265/article/details/82745466