如何在MaterialDatePicker中禁用过去的日期?

4
 //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方法仅适用于当前月份,因此我无法选择上个月的日期,但我仍然可以选择当前月份之前的日期。 如果有人可以帮忙,请告诉我。谢谢。
2个回答

10
你可以自己构建DateValidator,也可以直接使用库中提供的DateValidatorPointForward
像这样:
//Returns a DateValidator which enables days from {@code point}, in 
//UTC milliseconds, forward
CalendarConstraints.DateValidator dateValidator = DateValidatorPointForward.from(yourDate);
constraintsBuilder.setValidator(dateValidator);

在此输入图片描述


我已经做了这个,对我来说它很好用,但是我无法从你的代码中选择当前日期。它也阻止了选择当前日期。 - Deepak Rajput
  1. 我还想问一件事,假设我选择了下个月的日期,然后我打开日历,那么该日期会被选中,但是日历不会滚动到那个月。有什么办法解决吗?
  2. 如果我将builder实例从datepicker()更改为daterangepicker(),它不会采用默认主题,并且不会作为对话框打开,而是作为全屏幕打开。
- Deepak Rajput
@DeepakRajput,您的问题不是很清楚。DateValidator 是使日期可用/不可用的方法。您在 from 方法中使用了哪个值?您使用的是哪个版本的库和应用程序中使用的主题? - Gabriele Mariotti
我想说的是你的日期验证器是有效的,但它不允许我选择当前日期。它只允许我从当前日期的后一天开始选择。所以假设今天是24号,那么我不能选择24号,只能选择25号及以后的日期。 - Deepak Rajput
1
@DeepakRajput 这取决于您在“from”方法中使用的值(它以UTC毫秒为单位)。如果您需要验证所有日期> =现在,只需使用“dateValidator = DateValidatorPointForward.now();”。 - Gabriele Mariotti

2
你需要创建自己的DateValidator来实现此功能。一个日期是否可用取决于DateValidator.isValid()返回true还是false。请参考DateValidator
@Parcelize
class FutureDateValidator : CalendarConstraints.DateValidator {
    override fun isValid(date: Long): Boolean {
        return date > System.currentTimeMillis()
    }
}

然后将其用作验证器:

CalendarConstraints.Builder()
    .setValidator(FutureDateValidator())
    .build()

你的代码也出现了同样的问题,无法选择当前日期。 - Deepak Rajput

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接