android - 当我递增的间隔为 5 时,在 Android TimePicker 中编辑前一分钟和后一分钟

标签 android android-timepicker

我已经按照教程将 Android TimePicker 增加到 15 以外的间隔。

Android - TimePicker minutes to 15

我实际上已经将我的 timePicker 正确设置为以 5 为间隔递增。但是,当我不滚动 TimePicker 时,显示的前一分钟和后续分钟不是以 5 为增量。它们是单位数增量。有没有办法在 Android TimePicker 中编辑前一分钟和后一分钟?

这是 TimePicker 的图像。当您滚动浏览分钟时,中间数字以 5 为增量跳转,正如我希望的那样,但中间数字上方和下方的分钟(currentMinute)不是以 5 为增量,我希望它们也是。

enter image description here

最佳答案

此解决方案也适用于监听器以及以编程方式设置时间。

import android.content.Context
import android.util.AttributeSet
import android.widget.NumberPicker
import android.widget.TimePicker
import androidx.databinding.BindingAdapter
import java.lang.reflect.Field
import java.util.*


class TimePickerInterval @JvmOverloads constructor(
        context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : TimePicker(context, attrs, defStyleAttr) {

    private var MINUTE_INTERVAL = 1
    override fun getCurrentMinute(): Int {
        return super.getCurrentMinute() * MINUTE_INTERVAL
    }

    override fun getMinute(): Int {
        return super.getMinute() * MINUTE_INTERVAL
    }

    override fun onAttachedToWindow() {
        super.onAttachedToWindow()
        setUp()
    }

    private fun setUp() {
        try {
            val classForid = Class.forName("com.android.internal.R\$id")
            val field: Field = classForid.getField("minute")
            val mMinuteSpinner = findViewById<NumberPicker>(field.getInt(null))
            mMinuteSpinner.minValue = 0
            mMinuteSpinner.maxValue = 60 / MINUTE_INTERVAL - 1
            val displayedValues: MutableList<String> = ArrayList()
            var i = 0
            while (i < 60) {
                displayedValues.add(String.format("%02d", i))
                i += MINUTE_INTERVAL
            }
            mMinuteSpinner.displayedValues = displayedValues.toTypedArray()

        } catch (e: Exception) {
            e.printStackTrace()
        }
    }

    override fun setOnTimeChangedListener(onTimeChangedListener: OnTimeChangedListener) {
        super.setOnTimeChangedListener { tp, hour, minute ->
            onTimeChangedListener.onTimeChanged(tp, hour, minute * MINUTE_INTERVAL)
        }
    }

    override fun setMinute(minute: Int) {
        super.setMinute(minute/MINUTE_INTERVAL)
    }

    companion object {
        @JvmStatic
        @BindingAdapter("time_picker_set_minute_interval")
        fun setInterval(view: TimePickerInterval, interval: Int?) {
            interval?.let {
                view.MINUTE_INTERVAL = interval
                view.setUp()
            }
        }
    }
}

在您的 XML 中:

    <com.gixon.shared.widgets.TimePickerInterval
        android:id="@+id/tp_to"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:timePickerMode="spinner"
        time_picker_set_minute_interval="@{5}"
        />

关于android - 当我递增的间隔为 5 时,在 Android TimePicker 中编辑前一分钟和后一分钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15737403/

相关文章:

android - Action Bar 和 Title 不在一条线上

java - 从 Android 发布到 mysql php

android在写入后读回标签信息,无需第二次触摸标签

android - 从 timePickerDialog 获取输入

android - 如何在时间选择器中设置最大和最小时间?

android - 在问卷应用程序中使用 textView 数组

java - 将图像作为 Base64 字符串从 cms 发送到 Google Cloud 端点

java - fragment Activity 的简单时间选择器

android - 在 TimePicker 中使用键盘输入需要在 "Enter"之前按 "OK",否则值将被丢弃

Android API 21+ - 以编程方式在 TimePickerDialog 中隐藏模拟时钟