#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.