【问题标题】:databind slider in xmlxml中的数据绑定滑块
【发布时间】:2020-01-27 00:33:38
【问题描述】:

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

我一直在阅读listener bindings 并且一目了然的 xml 似乎让我 dp 下面的 app:onChange 类似于您将在我的“查看活动”类中看到的 addOnChangeListener(它将使用 kotlin 文件中的 addOnChangeListener,但我无法让它与 xml 文件中的直接 app:onChange 标记一起使用。

任何可以为我指明正确方向的建议或代码示例将不胜感激。谢谢。

/* 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
 }
}

【问题讨论】:

    标签: android kotlin mvvm


    【解决方案1】:

    您可以使用@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
       }
    

    绑定 Slider 和 TextView:

    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 添加到 Slider:

    app:textViewLabel="@{yourTextViewId}"
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-23
      • 2020-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-24
      • 2017-12-12
      • 2023-03-16
      相关资源
      最近更新 更多