如何为范围选择型material.Slider组件创建Binding Adapter获取滑块取值?
实现范围滑块RangeSlider的BindingAdapter方案
首先要明确,Material组件库的范围选择滑块类为RangeSlider,它的values属性返回一个Float类型的List,索引0对应选中的最小值,索引1对应选中的最大值。
1. 编写BindingAdapter相关代码
import androidx.databinding.BindingAdapter import androidx.databinding.InverseBindingAdapter import androidx.databinding.InverseBindingListener import com.google.android.material.slider.RangeSlider // 绑定选中的最小值 @BindingAdapter("selectedMinValue") fun setSelectedMinValue(slider: RangeSlider, value: Float?) { value ?: return val currentValues = slider.values if (currentValues[0] != value) { slider.values = listOf(value, currentValues[1]) } } // 绑定选中的最大值 @BindingAdapter("selectedMaxValue") fun setSelectedMaxValue(slider: RangeSlider, value: Float?) { value ?: return val currentValues = slider.values if (currentValues[1] != value) { slider.values = listOf(currentValues[0], value) } } // 反向获取最小值 @InverseBindingAdapter(attribute = "selectedMinValue", event = "selectedMinValueAttrChanged") fun getSelectedMinValue(slider: RangeSlider): Float { return slider.values[0] } // 反向获取最大值 @InverseBindingAdapter(attribute = "selectedMaxValue", event = "selectedMaxValueAttrChanged") fun getSelectedMaxValue(slider: RangeSlider): Float { return slider.values[1] } // 监听滑块值变化,触发反向绑定更新 @BindingAdapter( value = ["selectedMinValueAttrChanged", "selectedMaxValueAttrChanged"], requireAll = false ) fun setRangeSliderListeners( slider: RangeSlider, minListener: InverseBindingListener?, maxListener: InverseBindingListener? ) { slider.addOnChangeListener { _, _, _ -> minListener?.onChange() maxListener?.onChange() } }
2. 在XML布局中使用
直接在RangeSlider标签里绑定你ViewModel中的min和max变量即可:
<com.google.android.material.slider.RangeSlider android:id="@+id/range_slider" android:layout_width="match_parent" android:layout_height="wrap_content" android:valueFrom="0" android:valueTo="100" app:selectedMinValue="@={viewModel.minPrice}" app:selectedMaxValue="@={viewModel.maxPrice}" />
补充说明
- 如果你只需要监听值变化不需要双向绑定,可以直接写一个监听范围变化的BindingAdapter,直接回调min和max值即可,不需要写InverseBinding相关逻辑
- 注意要确保你使用的Material组件库版本已经支持
RangeSlider,版本要求至少为1.2.0-alpha01
内容的提问来源于stack exchange,提问作者Sunbey13
相关产品推荐
相关产品推荐

