【问题标题】:Android(Kotlin) Material Design Date Range Picker How to set Minimum and Maximum dates properly?Android(Kotlin) Material Design Date Range Picker 如何正确设置最小和最大日期?
【发布时间】:2023-01-19 19:50:07
【问题描述】:

我有一个日期范围选择器(材料设计),我想禁用以前的日期(因此最短日期将是当天),最大日期将是 6 个月后。我试过这样的事情:

    val calendar = Calendar.getInstance()
    val constraintsBuilderRange = CalendarConstraints.Builder()
    val dateValidatorMin: CalendarConstraints.DateValidator = DateValidatorPointForward.from(calendar.timeInMillis)
    val dateValidatorMax: CalendarConstraints.DateValidator = DateValidatorPointBackward.before(calendar.timeInMillis+100000000)

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


    val datePicker = MaterialDatePicker.Builder.dateRangePicker()
        .setTitleText("Select range")
        .setCalendarConstraints(constraintsBuilderRange.build())
        .build()

    datePicker.show(
        this.requireFragmentManager(),"date_range_picker"
    )

这有效,但我随机给dateValidatorMax 100000000。那么如何实现毫秒后6个月呢?我怎样才能在dateValidatorMin 中获得 currentDate 前 1 天?

【问题讨论】:

  • 一小时有 3,600,000 毫秒。所以 6 个月是 15,768,017,280(超过 150 亿毫秒)

标签: kotlin date time


【解决方案1】:

所以我通过 Kotlin 解决了这个问题,有一个非常简单的方法:

val dateValidatorMin: CalendarConstraints.DateValidator = DateValidatorPointForward.from(calendar.timeInMillis - 1.days.toLong(
        DurationUnit.MILLISECONDS))
val dateValidatorMax: CalendarConstraints.DateValidator = DateValidatorPointBackward.before(calendar.timeInMillis+ 180.days.toLong(
        DurationUnit.MILLISECONDS))

【讨论】:

    【解决方案2】:

    我不知道你是否还需要它,但也许它也会帮助其他人。

    我有一个类似的问题,我只需要启用从前一天到当前日期后 45 天范围内的日期。也就是说,今天,1 月 18 日,日历只会在 12-05-2022 到 01-17-2023 期间启用。

    我是这样做的:

    val dateValidatorMin: DateValidator =
        DateValidatorPointForward.from(
            Calendar.getInstance().timeInMillis - 45.days.toLong(DurationUnit.MILLISECONDS))
    
    val dateValidatorMax: DateValidator =
        DateValidatorPointBackward.before(
            Calendar.getInstance().timeInMillis - 1.days.toLong(DurationUnit.MILLISECONDS))
        
    val dateValidator: DateValidator = CompositeDateValidator.allOf(listOf(dateValidatorMin, dateValidatorMax))
    
    val constraints: CalendarConstraints =
        CalendarConstraints.Builder()
            .setValidator(dateValidator)
            .build()
    
    val builder = MaterialDatePicker.Builder.dateRangePicker()
        .setCalendarConstraints(constraints)
        .setTitleText(getString(R.string.label_select_date_range))
    
    val picker = builder.build() 
    

    E o resultado ficou assim:

    希望这可以帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多