【问题标题】:MaterialDatePicker Select Date between 2 dates onlyMaterialDatePicker 仅在 2 个日期之间选择日期
【发布时间】:2020-06-19 11:29:29
【问题描述】:

如何向 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")

【问题讨论】:

    标签: android kotlin android-datepicker material-components-android


    【解决方案1】:

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

    • 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());
    

    【讨论】:

    • 谢谢!这正是我想要的。
    • @AhmedAbdeen 您还可以构建您的自定义DateValidator 覆盖isValid(date: Long) 方法。
    • @GabrieleMariotti 如果我想从一年开始限制它怎么办?例如,最早的年份是 2009 年到当前年份?
    【解决方案2】:

    @GabrieleMariotti 的回答很好,但 DateValidatorPointBackwards 类不在 1.2 版之前的材料设计库中。如果您想在两个日期之间进行选择,并且您拥有 1.1 或更早版本的材料设计库,您可以这样做:

    val datePickerBuilder = MaterialDatePicker.Builder.datePicker()
    datePickerBuilder.setCalendarConstraints(
        CalendarConstraints.Builder()
            .setValidator(object : CalendarConstraints.DateValidator {
                override fun isValid(date: Long): Boolean {
                    return date >= startDate && date < endDate
                }
    
                override fun writeToParcel(p0: Parcel?, p1: Int) {}
    
                override fun describeContents(): Int {return 0}
            }).build()
    )
    val datePicker = datePickerBuilder.build()
    datePicker!!.show(fragmentManager, "date picker")
    

    其中 startDate 和 endDate 是长值

    【讨论】:

      【解决方案3】:

      使用这两种方法

      public void setMinDate (long minDate)
      public void setMaxDate (long maxDate)
      

      这里是官方文档。 https://developer.android.com/reference/android/widget/DatePicker#setMaxDate(long)

      例子

      val calender = Calendar.getInstance()
      val year = calender.get(Calendar.YEAR)
      val month = calender.get(Calendar.MONTH)
      val day = calender.get(Calendar.DAY_OF_MONTH)
      materialRangeBuilder.setMinDate(calender.getTimeInMillis())
      materialRangeBuilder.setMaxDate(calender.getTimeInMillis())
      

      【讨论】:

      • 那是安卓平台版本的日期选择器。
      • setMinDate 和 setMaxDate 在材料设计范围对象中不可用
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-07
      • 2015-07-08
      • 1970-01-01
      相关资源
      最近更新 更多