MaterialDatePicker 仅选择 2 个日期之间的日期

Ahm*_*een 12 android android-datepicker kotlin material-components-android

如何向 MaterialDatePicker 添加约束以强制用户仅选择 2 个日期之间的日期?

val constraintBuilder = CalendarConstraints.Builder()
    val materialRangeBuilder = MaterialDatePicker.Builder.datePicker()
    materialRangeBuilder.setTitleText("Book Date")
    materialRangeBuilder.setCalendarConstraints(constraintBuilder.build())

    val materialRangePicker = materialRangeBuilder.build()

    materialRangePicker.addOnPositiveButtonClickListener {
        Timber.d("$it")
    }

    materialRangePicker.show(supportFragmentManager, "DATE_RANGE_PICKER")
Run Code Online (Sandbox Code Playgroud)

Gab*_*tti 20

您可以使用 aDateValidator来限制选择。
特别是,您可以使用内置验证器:

  • DateValidatorPointForward 允许从给定点向前进行日期
  • DateValidatorPointBackward仅启用给定点之前的日期。

就像是:

MaterialDatePicker.Builder<Long> builder = MaterialDatePicker.Builder.datePicker();

CalendarConstraints.Builder constraintsBuilderRange = new CalendarConstraints.Builder();

//....define min and max for example with LocalDateTime and ZonedDateTime or Calendar

CalendarConstraints.DateValidator dateValidatorMin = DateValidatorPointForward.from(min.getTimeInMillis());
CalendarConstraints.DateValidator dateValidatorMax = DateValidatorPointBackward.before(max.getTimeInMillis());

ArrayList<CalendarConstraints.DateValidator> listValidators =
            new ArrayList<CalendarConstraints.DateValidator>();
listValidators.add(dateValidatorMin);
listValidators.add(dateValidatorMax);
CalendarConstraints.DateValidator validators = CompositeDateValidator.allOf(listValidators);
constraintsBuilderRange.setValidator(validators);

builder.setCalendarConstraints(constraintsBuilderRange.build());

MaterialDatePicker<Long> picker = builder.build();
picker.show(getSupportFragmentManager(), picker.toString());
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 谢谢你!这正是我一直在寻找的。 (2认同)

Rei*_*ana 6

这是 kotlin 的版本:

private fun calendarConstraints(): CalendarConstraints {
    val dateValidatorMin: DateValidator = DateValidatorPointForward.from(min.getTimeInMillis())
    val dateValidatorMax: DateValidator = DateValidatorPointBackward.before(max.getTimeInMillis())

    val listValidators = ArrayList<DateValidator>()
    listValidators.apply {
        add(dateValidatorMin)
        add(dateValidatorMax)
    }
    val validators = CompositeDateValidator.allOf(listValidators)

    return CalendarConstraints.Builder()
        .setValidator(validators)
        .build()
}
private fun setupCalendar() {
   val materialDatePickerBuilder = MaterialDatePicker.Builder.datePicker().setCalendarConstraints(calendarConstraints())}
Run Code Online (Sandbox Code Playgroud)