DataBinding自定义方法、参数绑定(BindingAdapter)

参考文档:

https://blog.csdn.net/guiying712/article/details/80411597

https://www.jianshu.com/p/92a73354d40a

有一些属性,比如监听器,并不能在xml绑定,下面举两个例子

绑定没有setter的参数

android:paddingLeft并没有与之对应的set方法,但是有个用于设置该属性的setPadding(left, top, right, bottom)方法,针对这一问题,使用BindingAdapter注解则能允许我们自定义这个属性调用set方法的方式。

Android framework中类已经为属性建立了BindingAdapter注解。

// kotlin
@BindingAdapter("android:paddingLeft")
//第一个参数代表要对View操作,之后的参数和注解的一一对应
fun setPaddingLeft(view: View, padding: Int) {
    view.setPadding(padding,
                view.getPaddingTop(),
                view.getPaddingRight(),
                view.getPaddingBottom())
}

绑定Linsener方法

以侧滑栏为例,进行函数绑定

首先在attrs自定义要绑定的函数名字,随便是什么都可以

      <attr name="onClosed" format="reference" />
      <attr name="onOpened" format="reference" />

在布局文件中使用:

<com.chauthai.swipereveallayout.SwipeRevealLayout
        android:id="@+id/swipe"
        android:layout_width="match_parent"
        android:layout_height="94dp"
        app:mode="normal"
        app:dragEdge="right"
        binding:onClosed="@{viewModel.方法1}"
        binding:onOpened="@{viewModel.方法2}"/>

绑定的方法要用这种写法

var deleteClosed: BindingCommand<*> = BindingCommand<Any?>(BindingAction {
        Log.e("aaa","deleteClosed")
    })

但是现在xml并不知道你绑定这俩是啥,于是要去告诉它怎么做

静态函数,注解中表明你要用到什么参数

方法名第一个参数代表着你要操作的布局名称

object BindingAdapter {

    @BindingAdapter(
        value = ["onOpened", "onClosed"]
    )
    //标记为静态
        @JvmStatic
    //第一个参数代表要对SwipeRevealLayout操作,之后的参数和注解的一一对应
    //记得参数可空
    fun setSwipeRevealLayoutListener(view: SwipeRevealLayout,  onOpened: BindingCommand<*>?, onClosed: BindingCommand<*>?) {
        //此时随意进行操作设置
        //此例子是为事件设定监听绑定函数
        //设定监听器
        view.setSwipeListener(object :SwipeRevealLayout.SwipeListener{
            override fun onOpened(view: SwipeRevealLayout?) {
                //当onOpened时执行绑定的command onOpened
                onOpened?.execute()
            }

            override fun onClosed(view: SwipeRevealLayout?) {
                onClosed?.execute()
            }

            override fun onSlide(view: SwipeRevealLayout?, slideOffset: Float) {

            }

        })
    }

}