Select 使用 MaterialDateTimePicker 的时间块

Select blocks of time with MaterialDateTimePicker

我想展示一个时钟,其中只能 selected 时间块可以 selected。例如:我希望时钟只让我 select 次从 09:00 到 10:00 或从 12:00 到 12:30 或从 14:00 到18:00。这些范围之外的所有时间都不应该 selectable.

使用 MaterialDateTimePicker 我能够设置 selected 时间的数组:

val time = TimePickerDialog.newInstance(timeSet, true)
time.setSelectableTimes(arrayOf(Timepoint(10), Timepoint(11)))

但这只让我 select 10:00 和 11:00 的时间,而不是它们之间的时间间隔。

是否可以像我用这个库解释的那样做一个行为?

我对 "additional options" 类别进行了一些挖掘(实际上就是您链接的类别),并发现了 enableMinutes(true)。根据文档,这默认为 true,所以我不确定它是如何在您的代码中被禁用的。如果您还想启用选择秒数,请使用 enableSeconds(true).

引用文档:

TimepickerDialog enableSeconds(boolean enableSconds) and enableMinutes(boolean enableMinutes) Allows you to enable or disable a seconds and minutes picker on the TimepickerDialog. Enabling the seconds picker, implies enabling the minutes picker. Disabling the minute picker will disable the seconds picker. The last applied setting will be used. By default enableSeconds = false and enableMinutes = true.

所以我决定创建一个新方法来创建时间点数组:

private fun getTimes(array: JSONArray): Array<Timepoint> {
    val times = arrayListOf<Timepoint>()
    for (i in 0..array.length().minus(1)) {
        val format = SimpleDateFormat("HH:mm", Locale.getDefault())

        val start = Calendar.getInstance()
        start.time = format.parse(array.getJSONObject(i).getString("start"))

        val end = Calendar.getInstance()
        end.time = format.parse(array.getJSONObject(i).getString("end"))

        while (!start.after(end)) {
            times.add(Timepoint(start.get(Calendar.HOUR_OF_DAY), start.get(Calendar.MINUTE)))
            start.add(Calendar.MINUTE, 1)
        }
    }

    return times.toArray(arrayOfNulls<Timepoint>(times.size))
}

我会这样称呼他:

time.setSelectableTimes(getTimes(array))

解释:

使用方法:

time.setSelectableTimes(arrayOf(Timepoint(10), Timepoint(11)))

我只能分别选择10:00h和11:00h的时间,所以解决方法是找到10:00h和11:00h之间的所有时间,将它们添加到数组中。只有这样我才能使用这个新数组调用上面的方法。