DataBinding使用指南(二)@BindingAdapter自定义属性

DataBinding之 自定义属性 Binding adapters

  • @BindingAdapter 注解
  • 简单实用
    • 多参数使用
  • 使用属性旧值

上一章我们主要讲解了简单的文字绑定操作,这一章我们讲一下复杂的数据绑定,例如图片加载。

@BindingAdapter 注解

databinding中自定义属性依赖于注解 @BindingAdapter

  1. 作用于方法(和类无关,这个自定义属性的方法可以写在任何地方)
  2. 它定义了xml的属性赋值的java实现(注解的方法中就是我们对这个控件进行处理)
  3. 方法必须为公共静(public static)方法,可以有一到多个参数。

简单实用

直接上代码

	//“app:imgUrl” 这就是在xml中的属性
    @android.databinding.BindingAdapter("app:imgUrl")
    public static void setImgUrl(ImageView imageView, String url) {
        GlideApp.with(imageView)
                .load(url)
                .into(imageView);
    }

xml 中使用

        <ImageView
            android:id="@+id/img_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            app:imgUrl="@{user.url}"
            />

多参数使用

继续上代码

    @android.databinding.BindingAdapter(value = {"app:imgUrl", "app:placeholder"}, requireAll = false)
    public static void loadImg(ImageView imageView, String url, Drawable placeholder) {
        GlideApp.with(imageView)
                .load(url)
                .placeholder(placeholder)
                .into(imageView);
    }

xml中代码

        <ImageView
            android:id="@+id/img_view"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:adjustViewBounds="true"
            app:imgUrl="@{user.url}"
            app:placeholder="@{@drawable/ic_launcher_background}"
            />

这里 requireAll = false 表示我们可以使用这两个两个属性中的任一个或同时使用,如果requireAll = true 则两个属性必须同时使用,不然报错。默认为 true。
xml 中@{@drawable/ic_launcher_background} 引用的是资源文件中的图片

使用属性旧值

@BindingAdapter 自定义属性可以使用属性旧值,即上一次设置的属性值
上代码

   @android.databinding.BindingAdapter(value = {"app:imgUrl", "app:placeholder"}, requireAll = false)
   public static void loadImg(ImageView imageView, String oldUrl, Drawable oldError, String newUrl, Drawable newError) {
       GlideApp.with(imageView)
               .load(newUrl)
               .placeholder(oldError)
               .into(imageView);
   }

这里要注意一点:如果是多个属性,那么方法的参数必须要把所有的属性的旧值列举出来,然后在列举属性新值。这个顺序是不能乱的。并不是一个属性旧值跟一个属性新值。

你可能感兴趣的:(Android,Databinding,databinding,@BindingAdapter)