参考文档:
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) {
}
})
}
}
近期评论