DataBinding之BindingAdapter使用记录

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情

之前有说到DataBinding中对集合和文字拼接的使用,这篇文章我们乘胜追击来讲讲BindingAdapter。不得不说,有了BindingAdapter的辅助,使用DataBinding更加得心应手,下面就来简单介绍下使用方法和其中遇到的坑。

个人理解,这个注解就是生成一个全局的控件属性。这个注解面向一个public static方法,方法名自己定义。注解方法的第一个形参就是我们想要对其创建属性的自定义命名,可以是一个字符串,也可是一个value命名的数组。第二个形参是个布尔值,意思是是否必填所有自定义参数。

@Target(ElementType.METHOD)
public @interface BindingAdapter {

    String[] value();

    boolean requireAll() default true;
}

被注解的属性是面向项目全局的。这个注解对应的方法中,传入对应属性值,我们通过自己的需要实现数据和控件的之间转化操作。

使用场景:
  • ImageView网络图片加载
  • shape的操作
  • 点击事件的防抖

其实只要觉得方便,任何相关的操作都可在此进行,管理起来也比较方便,相当于全局管理。

网络图片加载
@BindingAdapter(value = ["remoteUrl", "placeholder", "errorId"], requireAll = false)
fun ImageView.remoteUrl(
    url: String?,
    placeholder: Int = 0,
    errorId: Int = R.drawable.ic_load_fail
) {
    loadImage(url, placeholder, errorId)
}

Kotlin扩展方法

//加载图片
fun ImageView.loadImage(
    url: String,
    placeholder: Int = 0,
    errorPic: Int = R.drawable.ic_load_fail
) {
    
    GlideApp.with(this.context)
        .load(url)
        .error(errorPic)
        .placeholder(placeholder)
        .into(this)
}

上面说到requireAll为ture时,则value内的三个属性都需要填写才不会报错,为false时则可任意选填其中的属性。

xml中
<ImageView
    remoteUrl="@{bean.url}"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>
shape操作

相信大家在开发中一定避免不了一些圆、秒变、渐变、虚线等ui效果。初期都是手动创建xml,每一个效果可能都要单独一个shape。即便后期有了一些第三方轮子,但视图避免不了需要多嵌套一层,这时候使用BindingAdapter,简直不要太爽。

@BindingAdapter(
    value = [
        "background_res",//背景色
        "shape_solidColor",//填充颜色
        "shape_radius",//圆角
        "shape_strokeColor",//描边颜色
        "shape_strokeWitdh",//描边宽度
        "shape_dashWith",//描边虚线单个宽度
        "shape_dashGap",//描边间隔宽度
        "shape_isGradual",//是否渐变
        "shape_startColor",//渐变开始颜色
        "shape_centerColor",//渐变中间颜色
        "shape_endColor",//渐变结束颜色
        "shape_gradualOrientation",//渐变角度
        "shape_tl_radius",//上左圆角
        "shape_tr_radius",//上右圆角
        "shape_bl_radius",//下左圆角
        "shape_br_radius"//下右圆角
    ],
    requireAll = false
)
fun View.setViewBackground(
    //注意  这里的参数只能按照上面value值顺序排列  否则值对应不匹配
    background_res: Int = 0,
    solidColor: Int = Color.TRANSPARENT,
    radius: Int = 0,
    strokeColor: Int = Color.TRANSPARENT,
    strokeWidth: Int = 0,
    shape_dashWith: Int = 0,
    shape_dashGap: Int = 0,
    shape_isGradual: Boolean = false,
    shape_startColor: Int = Color.TRANSPARENT,
    shape_centerColor: Int = Color.TRANSPARENT,
    shape_endColor: Int = Color.TRANSPARENT,
    shape_gradualOrientation: Int = 1,//TOP_BOTTOM = 1 ,TR_BL = 2,RIGHT_LEFT = 3,BR_TL = 4,BOTTOM_TOP = 5,BL_TR = 6,LEFT_RIGHT = 7,TL_BR = 8
    shape_tl_radius: Int = 0,
    shape_tr_radius: Int = 0,
    shape_bl_radius: Int = 0,
    shape_br_radius: Int = 0,
) {
    ......
}

以上几乎包含了所有shape操作,都是非必填,可以任意搭配,实现自己想要的结果。需要注意的是,value中的属性名必须和自定义方法内入参下标对应,否则会出现意想不到的错误。

都说有优点就有缺点,开发过程中发现一个比较致命的缺点,视图无法预览,需要运行在手机上才能看到效果。但优点也是显而易见的,这么一个方法就能解决所有shape效果,你说香不香。

相信大家应该都知道怎么使用BindingAdapter了,其实还是得看个人习惯。如何使用起来觉得舒服,根据自己的编码习惯封装对应的方法,使得开发效率大大增幅。不仅解放了双手,出现问题的概率也会减少。希望这篇文章对大家有所帮助。

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 4 天,点击查看活动详情