2

我有以下RangeSlider并且我正在使用 DataBinding 来提供滑块的最小值/最大值,因为它可能会在用户在屏幕上时发生变化。

范围滑块

layout.xml

<layout ...>
    <data>

        <variable
            name="item"
            type="MyDataItem" />
    </data>

    ...

        <com.google.android.material.slider.RangeSlider
            android:id="@+id/my_slider"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:stepSize="1"
            android:valueFrom="@{item.minimum}"
            android:valueTo="@{item.maximum}"
            ... />
</layout>

MyDataItem

data class MyDataItem() {
    val minimum = MutableLiveData(Int.MIN_VALUE)
    val maximum = MutableLiveData(Int.MAX_VALUE)
}

但是,每当应用程序试图放大我得到的视图时java.lang.IllegalStateException: valueFrom(0.0) must be smaller than valueTo(0.0)

4

2 回答 2

1

这是一个完整的解决方案,如何实现双向数据绑定RangeSlider

视图模型/演示者:

var sliderRange = MutableLiveData<List<Float>>().apply { value = listOf(5f, 90f) }

把你的初始数据放在那里

然后,布局:

<com.google.android.material.slider.RangeSlider
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:stepSize="1"
    android:valueFrom="1"
    android:valueTo="100"
    app:values="@={vm.sliderRange}" />

最后是如何把东西放在一起;BindingAdapterInverseBindingAdapter

@InverseBindingAdapter(attribute = "values")
fun getRangeSlider(slider: RangeSlider): List<Float> {
    return slider.values
}

@BindingAdapter("app:valuesAttrChanged")
fun setListeners(
    slider: RangeSlider,
    attrChange: InverseBindingListener
) {
    val listener = RangeSlider.OnChangeListener { _, _, _ -> attrChange.onChange() }
    slider.addOnChangeListener(listener)
}

祝你好运,'。

于 2021-10-27T07:09:42.717 回答
0

返回 2^-31的Int.MIN_VALUE值,因此它小于 0。

Int.MAX_VALUE返回 2^31 的值,使其大于 100。

RangeSlider限制是从 0 到 100。尝试使用一些从 0 到 100 的值。

于 2021-08-06T21:37:18.373 回答