【问题标题】:Limit to max 7 days selection in Material date range picker Android在材料日期范围选择器 Android 中限制为最多 7 天选择
【发布时间】:2021-04-07 14:19:07
【问题描述】:

我已经为日期范围选择实现了this

如何限制日期范围的限制。我希望用户从所选的开始日期最多选择 7 天。

在下面添加我的代码,

private fun showDateRangePicker() {
    val constraintsBuilder = CalendarConstraints.Builder()
    val validators: ArrayList<CalendarConstraints.DateValidator> = ArrayList()
    validators.add(DateValidatorPointBackward.before(MaterialDatePicker.todayInUtcMilliseconds()))
    validators.add(DateValidatorWeekdays())
    constraintsBuilder.setValidator(CompositeDateValidator.allOf(validators))

    val dateRangePicker =
            MaterialDatePicker.Builder.dateRangePicker()
                    .setTitleText("Select dates")
                    .setTheme(R.style.MaterialCalendarTheme)
                    .setSelection(Pair(MaterialDatePicker.todayInUtcMilliseconds(), MaterialDatePicker.todayInUtcMilliseconds()))
                    .setCalendarConstraints(constraintsBuilder.build())
                    .build()
    dateRangePicker.show(supportFragmentManager, dateRangePicker.toString())
}

【问题讨论】:

  • 有什么问题?
  • @GabrieleMariotti 我想限制用户选择最多 7 天的开始日期。

标签: android datepicker android-datepicker materialdatepicker


【解决方案1】:

库提供的所有内置验证器都是静态的。
它并不完美,但您可以定义一个自定义 Validator,例如:

public class RangeDateValidator implements CalendarConstraints.DateValidator {

    private MaterialDatePicker rangePicker;
    final int numberOfDays;

    public RangeDateValidator (int numberOfDays){
        this.numberOfDays = numberOfDays;
    }

    public void setDatePicker(MaterialDatePicker rangePicker) {
        this.rangePicker = rangePicker;
    }

    @Override
    public boolean isValid(long date) {
        Pair<Long, Long> selection =(Pair<Long, Long>) rangePicker . getSelection ();
        if (selection != null) {
            Long startDate = selection . first;
            if (startDate != null) {
                long days =(numberOfDays - 1) * TimeUnit.DAYS.toMillis(1);;
                if (date > startDate + days)
                    return false;
                if (date < startDate)
                    return false;
            }
        }
        return true;
    }
}

然后:

    val dateRangePickerBuilder =
        MaterialDatePicker.Builder.dateRangePicker()

    val constraintsBuilderRange = CalendarConstraints.Builder()
    val dateValidator = RangeDateValidator(7) //number of days
    constraintsBuilderRange.setValidator(dateValidator)
    dateRangePickerBuilder.setCalendarConstraints(constraintsBuilderRange.build())

    val datePicker = dateRangePickerBuilder.build()
    dateValidator.setDatePicker(datePicker)
    datePicker.show(supportFragmentManager, datePicker.tag)

【讨论】:

  • 一旦你选择了从20到26的日期范围,那么你将无法选择20之前的日期。
  • 刚刚添加了这个条件返回日期
  • @hasan_shaikh 随意更改 isValid 方法。
  • 实施上述方案后。 7 天后的日期显示为灰色。但灰显的 UI 并不一致。有时它会在 7 天后启用日期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 2020-10-25
  • 2018-04-20
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
  • 2020-06-11
相关资源
最近更新 更多