如何在 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 获取选定的日期

MaterialDatePicker 选择后返回不正确的日期

MaterialDatePicker,选择结束日期后应用程序崩溃

MaterialDatePicker 显示当前日期而不是需要

如何在 YYYY.MM-DD 中更改 Material Datepicker 的格式