Android(Kotlin) Material Design日期范围选择器如何正确设置最小/最大日期?
Material Design日期范围选择器:正确设置最小/最大日期
核心解决思路
不要手动计算毫秒数(月份天数、闰年等因素会导致误差),直接用Android提供的日期工具类做日期偏移:
1. 计算6个月后的毫秒值
复制当前Calendar实例,调用add(Calendar.MONTH, 6)偏移6个月,再获取对应的毫秒值,自动处理不同月份的天数差异。
2. 获取当前日期前一天的毫秒值
复制当前Calendar实例,调用add(Calendar.DAY_OF_MONTH, -1)得到前一天的时间,用这个值作为DateValidatorPointForward的起点,就能实现禁用当日之前的日期(validator会允许该时间点之后的所有日期,即当日及以后)。
修正后的完整代码
val calendar = Calendar.getInstance() // 复制日历实例,计算最小日期(前一天) val minCalendar = Calendar.getInstance().apply { add(Calendar.DAY_OF_MONTH, -1) } // 复制日历实例,计算最大日期(6个月后) val maxCalendar = Calendar.getInstance().apply { add(Calendar.MONTH, 6) } val constraintsBuilderRange = CalendarConstraints.Builder() // 禁用前一天及更早的日期,允许当日及以后 val dateValidatorMin = DateValidatorPointForward.from(minCalendar.timeInMillis) // 禁用6个月后及更晚的日期,允许6个月内的日期 val dateValidatorMax = DateValidatorPointBackward.before(maxCalendar.timeInMillis) val listValidators = arrayListOf(dateValidatorMin, dateValidatorMax) val validators = CompositeDateValidator.allOf(listValidators) constraintsBuilderRange.setValidator(validators) val datePicker = MaterialDatePicker.Builder.dateRangePicker() .setTitleText("Select range") .setCalendarConstraints(constraintsBuilderRange.build()) .build() datePicker.show(this.requireFragmentManager(), "date_range_picker")
补充说明
- 使用
apply函数复制并修改日历实例,避免污染原calendar对象的时间 DateValidatorPointForward.from(minTime):允许所有晚于minTime的日期,用前一天的时间刚好匹配"禁用当日之前"的需求DateValidatorPointBackward.before(maxTime):允许所有早于maxTime的日期,精准限制在6个月范围内
内容的提问来源于stack exchange,提问作者user17121955
相关产品推荐
相关产品推荐

