如何在 MaterialDatePicker 中禁用过去的日期?
Posted
技术标签:
【中文标题】如何在 MaterialDatePicker 中禁用过去的日期?【英文标题】:How to disable past dates in MaterialDatePicker? 【发布时间】:2020-08-06 20:43:24 【问题描述】: //Material Date Picker
private val calendar = Calendar.getInstance()
private val constraintsBuilder = CalendarConstraints.Builder().setStart(calendar.timeInMillis)
private val builder = MaterialDatePicker.Builder.datePicker()
private val picker = builder
.setSelection(calendar.timeInMillis)
.setInputMode(MaterialDatePicker.INPUT_MODE_CALENDAR)
.setCalendarConstraints(constraintsBuilder.build())
.build()
我正在使用上面的代码打开日历 setSelection 方法选择当前日期和 setStart 仅适用于当前月份所以我无法选择上个月的日期,但 我仍然可以选择当前月份的过去日期。
如果有任何可以帮助我。请告诉我。谢谢。
【问题讨论】:
【参考方案1】:您可以构建自己的DateValidator
,也可以只使用库提供的DateValidatorPointForward
。
类似:
//Returns a DateValidator which enables days from @code point, in
//UTC milliseconds, forward
CalendarConstraints.DateValidator dateValidator = DateValidatorPointForward.from(yourDate);
constraintsBuilder.setValidator(dateValidator);
【讨论】:
我这样做了,但对我来说它工作正常,但我无法从您的代码中选择当前日期。它也阻止选择当前日期。 1. 我还想问一件事,假设我选择了下个月的日期,然后我打开日历,而不是选择了该日期,但日历不会滚动到该月。知道怎么做吗? 2. 如果我将 builder 实例从 datepicker() 更改为 daterangepicker() 它不采用默认主题并且 不打开作为dailog,它以全屏方式打开。 @DeepakRajput 你的问题不太清楚。 DateValidator 是启用/禁用日期的方法。您在 from 方法中使用哪个值?您使用的是哪个版本的库以及您在应用中使用的主题? 我的意思是您的日期验证器正在工作,但它不允许我选择当前日期。它允许我从当前日期后的第二天开始选择。所以假设今天是 24,那么我不能选择 24,我只能从 25 中选择。 @DeepakRajput 这取决于您在from
方法中使用的值(以 UTC 毫秒为单位)。如果您需要验证所有日期>= 现在只需使用dateValidator = DateValidatorPointForward.now();
【参考方案2】:
您需要为此创建自己的DateValidator
。启用/禁用日期取决于 DateValidator.isValid()
返回 true 还是 false
@Parcelize
class FutureDateValidator : CalendarConstraints.DateValidator
override fun isValid(date: Long): Boolean
return date > System.currentTimeMillis()
然后将此验证器用作:
CalendarConstraints.Builder()
.setValidator(FutureDateValidator())
.build()
【讨论】:
同样的事情发生在您的代码无法选择当前日期。以上是关于如何在 MaterialDatePicker 中禁用过去的日期?的主要内容,如果未能解决你的问题,请参考以下文章
MaterialDatePicker 选择后返回不正确的日期
MaterialDatePicker,选择结束日期后应用程序崩溃