Как использовать привязку данных и данные LiveData для RangeSlider (значение от и значение)

#android #android-livedata #android-databinding #rangeslider #android-slider

Вопрос:

У меня есть следующий индикатор диапазонов, и я использую привязку данных, чтобы указать минимальное / максимальное значение ползунка, так как оно может измениться, пока пользователь находится на экране.

Дальнобойщик

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)

Ответ №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}" />
 

И, наконец, как собрать вещи воедино; BindingAdapter с InverseBindingAdapter :

 @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)
}
 

Удачи».

Ответ №2:

Int.MIN_VALUE Возвращает значение 2^-31, так что оно меньше 0.

И Int.MAX_VALUE верните значение 2^31, чтобы оно было больше 100.

RangeSlider пределы-от 0 до 100. Попробуйте использовать некоторые значения от 0 до 100.

Комментарии:

1. RangeSlider максимальное значение не ограничено 100, так как я успешно установил его в числовое значение Int.MAX_VALUE непосредственно в xml. Проблема, по-видимому, связана с LiveData, так как по какой-то причине он пытается установить valueFrom значение 0, несмотря на то, что мои LiveData даже не инициализируются с 0.