美文网首页Android DatabindAndroid开发经验谈Android开发
DataBinding 输入控件的双向绑定数据绑定实现

DataBinding 输入控件的双向绑定数据绑定实现

作者: 码农明明 | 来源:发表于2017-10-19 14:16 被阅读71次

    熟悉DataBinding的小伙伴都知道,使用EditText控件是可以通过使用@={}实现双向数据绑定,但如果是非官方的输入控件类呢?答案显而易见,是不可以滴,那么我们如何实现像EditText那样的双向数据绑定功能?接下来为您揭晓。

    1. 第一步,getter方法编写
    需要在方法前加入注解@InverseBindingAdapter, attribute表示你要绑定的值名称;event表示你要绑定的时间名称,可以使用控件的设置监听事件的方法命名,

        @InverseBindingAdapter(attribute = "rate", event = "setOnRatingSliderChangeListener")
        @JvmStatic
        fun getRating(view: SmileBar):Int{
             return view.rating
        }
    

    2.第二步,setter方法编写

    这一步很简单,主要是为控件赋值,value需要和上一步的attribute一致。

     @BindingAdapter(value ="rate")
        @JvmStatic
        fun setRating(view: SmileBar, rate:Int){
            view.rating = rate
        }
    

    3. 第三步,监听值的变化

    这一步主要是让Databinding知道数据发生变化了,需要将控件的值逆向输出;该方法的第二个参数为InverseBindingListener是写死的,这个法主要为控件添加监听事件,当其变化时调用InverseBindingListener的onChange方法。需要和第一步的event一致。

    @BindingAdapter(value = "setOnRatingSliderChangeListener")
        @JvmStatic
        fun setRatingListener(view:SmileBar, listener: InverseBindingListener){
            view.setOnRatingSliderChangeListener(object :SmileBar.OnRatingSliderChangeListener{
                override fun onPendingRating(p0: Int) {
                }
                override fun onFinalRating(p0: Int) {
                   listener.onChange()
                }
                override fun onCancelRating() {
                }
            })
        }
    

    4. 使用示例

    这是一个打分控件,通过使用@={},当其等级变化时,item的rate值会变得和该控件的rate值相同

    <com.eugeneek.smilebar.SmileBar
                        android:id="@+id/smile_rating"
                        android:layout_width="match_parent"
                        android:layout_height="wrap_content"
                        app:smileHeight="@dimen/icon_bar"
                        app:smileWidth="@dimen/icon_bar"
                        app:horizontalSpacing="@dimen/interval_text"
                        app:smileDefault="@drawable/ic_smile"
                        app:smileRate1="@drawable/ic_smile1"
                        app:smileRate2="@drawable/ic_smile2"
                        app:smileRate3="@drawable/ic_smile3"
                        app:smileRate4="@drawable/ic_smile4"
                        app:smileRate5="@drawable/ic_smile5"
                        android:layout_marginLeft="@dimen/interval_medium"
                        android:layout_toEndOf="@id/tv_label_rate"
                        app:rate="@={item.rate}"
                        />
    

    相关文章

      网友评论

      • f464b698aaf6:这个很有用。我原来写了一个自定义控件,但是却发现传值这样会报错,我现在就试试你的这样方式。如果可以是很赞的呦
        码农明明: @Tao_0ce2 嗯,折腾吧

      本文标题:DataBinding 输入控件的双向绑定数据绑定实现

      本文链接:https://www.haomeiwen.com/subject/rkpuuxtx.html