代码之家  ›  专栏  ›  技术社区  ›  EvOlaNdLuPiZ

xml中的数据绑定滑块

  •  0
  • EvOlaNdLuPiZ  · 技术社区  · 5 年前

    我正在使用MVVM开发一个应用程序,并成功地添加了按钮和文本输入等简单的ui元素,但现在我正试图弄清楚如何绑定 material slider .

    我一直在阅读 listener bindings 虽然xml看起来让我把下面的app:onChange设计成类似于您在我的“视图活动”类中看到的addOnChangeListener(它将与kotlin文件中的addOnCchangeListener一起工作,但我无法让它与xml文件中的direct-app:onCohange标记一起工作。

    如果您能提供任何建议或代码示例,为我指明正确的方向,我们将不胜感激。非常感谢。

    /*xml布局文件*/

    <com.google.android.material.slider.Slider
    android:id="@+id/material_slider_min_temperature"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:valueFrom="1"
    android:valueTo="2"
    android:stepSize="1"
    app:onChange="@{(slider, value, fromUser)-> mViewModel.fireSliderMinRQ(slider,value,fromUser)}"/>
    

    /*视图模型*/

    fun fireSliderMinRQ(slider: Slider, value: Float, fromUser: Boolean){
     //this will not bind correctly, i can't compile and access the parameters 
    }
    

    /*查看活动*/

    this.mSliderMinTemperature!!.addOnChangeListener { slider, value, fromUser ->
     this.mTvMinTemperature.text = value.toInt().toString()
      slider.setOnTouchListener { v, event ->
       when(event.action){
        MotionEvent.ACTION_UP -> {
        this.mSliderMaxTemperature!!.isEnabled = true
       }
      }
      false
     }
    }
    
    0 回复  |  直到 5 年前
        1
  •  3
  •   frezze09    4 年前

    您可以使用 @BindingAdapter .

        @JvmStatic
        @BindingAdapter(value = ["onValueChangeListener"])
        fun setOnValueChangeListener(slider: Slider, listener: OnValueChangeListener) {
            slider.addOnChangeListener { _: Slider?, value: Float, _: Boolean ->
                listener.onValueChanged(value)
            }
        }
    
    
        interface OnValueChangeListener {
            fun onValueChanged(value: Float)
        }
    

    XML格式:

       <com.google.android.material.slider.Slider
            android:id="@+id/slider"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:onValueChangeListener="@{(value)-> vm.onValueChanged(value)}" />
    

    在ViewModel中:

       fun onValueChanged(value: Float) {
          // use slider's value
       }
    

    绑定滑块和文本视图:

    this.mTvMinTemperature.text=value.toInt().toString()

    将滑块的值设置为文本到TextView:

    @JvmStatic
    @BindingAdapter(
        value = [
            "textViewLabel",
            "valueFormat"
        ], requireAll = false
    )
    fun setTextViewLabel(
        slider: Slider,
        textViewLabel: TextView,
        valueFormat: String?
    ) {
        slider.addOnChangeListener { _: Slider?, value: Float, _: Boolean ->
            valueFormat
                ?.let { format ->
                    textViewLabel.text = String.format(format, value)
                }
                ?: let { textViewLabel.text = value.toString() }
        }
    }
    

    将XML添加到滑块:

    app:textViewLabel="@{yourTextViewId}"
    

    此外,您还可以使用@BindingAdapter通过XML设置OnTouchListener。