4

我正在编写一个应用程序,用户需要指定一个给定的时间点,但我似乎无法弄清楚如何设置用户可以选择的分钟值,只使用 5 的增量而不是 1 的增量.

简而言之,当用户滚动可用数量时,他/她只能看到 0、5、10、15 等。

先感谢您。

4

6 回答 6

7

为确保您与 API 21+ 兼容,请确保您的 TimePicker 具有以下属性:

android:timePickerMode="spinner"

那么这里是如何以编程方式设置间隔的方法。如果找不到分钟字段,则此方法将使用标准 TimePicker:

private static final int INTERVAL = 5;
private static final DecimalFormat FORMATTER = new DecimalFormat("00");

private TimePicker picker; // set in onCreate
private NumberPicker minutePicker;

public void setMinutePicker() {
    int numValues = 60 / INTERVAL;
    String[] displayedValues = new String[numValues];
    for (int i = 0; i < numValues; i++) {
        displayedValues[i] = FORMATTER.format(i * INTERVAL);
    }

    View minute = picker.findViewById(Resources.getSystem().getIdentifier("minute", "id", "android"));
    if ((minute != null) && (minute instanceof NumberPicker)) {
        minutePicker = (NumberPicker) minute;
        minutePicker.setMinValue(0);
        minutePicker.setMaxValue(numValues - 1);
        minutePicker.setDisplayedValues(displayedValues);
    }
}

public int getMinute() {
    if (minutePicker != null) {
        return (minutePicker.getValue() * INTERVAL);
    } else {
        return picker.getCurrentMinute();
    }
}
于 2015-08-28T13:32:28.237 回答
4

所有相关答案都需要您设置一个 OnTimeChangedListener。我的解决方案是扩展 android TimePicker,并修改它的构造函数:

    // minute
    mMinuteSpinner = (NumberPicker) findViewById(R.id.minute);
    mMinuteSpinner.setMinValue(0);
    mMinuteSpinner.setMaxValue(3);
    mMinuteSpinner.setDisplayedValues(new String[]{"0", "15", "30", "45"});
    mMinuteSpinner.setOnLongPressUpdateInterval(100);
    mMinuteSpinner.setFormatter(NumberPicker.getTwoDigitFormatter());

所以你可以有你想要的间隔。

于 2013-07-02T11:10:08.903 回答
2

谢谢@Quadddd,这是 Kotlin 中的代码

private val INTERVAL = 5


private val FORMATTER = DecimalFormat("00")

  private var picker: TimePicker? = null // set in onCreate
  private var minutePicker: NumberPicker? = null

  fun setMinutePicker() {
    val numValues = 60 / INTERVAL
    val displayedValues = arrayOfNulls<String>(numValues)
    for (i in 0 until numValues) {
      displayedValues[i] = FORMATTER.format(i * INTERVAL)
    }

    val minute = picker?.findViewById<NumberPicker>(Resources.getSystem().getIdentifier("minute", "id", "android"))
    if (minute != null) {
      minutePicker = minute
      minutePicker!!.minValue = 0
      minutePicker!!.maxValue = numValues - 1
      minutePicker!!.displayedValues = displayedValues
    }
  }

  fun getMinute(): Int {
    return if (minutePicker != null) {
      minutePicker!!.getValue() * INTERVAL
    } else {
      picker!!.currentMinute
    }
  }
于 2018-07-02T10:27:12.190 回答
0

在网上搜索后,我没有找到最简单的解决方案。
所以我决定分享:
你可以使用反射!
以下代码使用 10 分钟的间隔,但您可以在 DISPLAYED_MINS 数组中选择要使用的分钟数。

private final static String[] DISPLAYED_MINS = { "0", "10", "20", "30", "40", "50" };

private NumberPicker getMinuteSpinner(TimePicker t)
{
    try
    {
        Field f = t.getClass().getDeclaredField("mMinuteSpinner"); // NoSuchFieldException
        f.setAccessible(true);
        return (NumberPicker) f.get(t); // IllegalAccessException
    }
    catch (Exception e)
    {
        Log.e("timepicker","field name has been changed, check grepcode");
        return null;
    }
}

当您创建时间选择器时:

final TimePicker dpStartDate = (TimePicker) view.findViewById(R.id.dpStartDate);
NumberPicker startMinSpiner = getMinuteSpinner(dpStartDate);
if (null != startMinSpiner)
{
    startMinSpiner.setMinValue(0);
    startMinSpiner.setMaxValue(DISPLAYED_MINS.length - 1);
    startMinSpiner.setDisplayedValues(DISPLAYED_MINS);
}

只是不要忘记 getCurrentMinute() 在 DISPLAY_MINS 数组中返回选定的分钟。为了得到分钟:

int theTime = 0;
for (String number: DISPLAYED_MINS) {
    int theNumber = Integer.parseInt(number);
    if (theNumber % 5 != 0) {
        theNumber = ((int)(theNumber / 5)) * 5;
    }
    if (theNumber == dpStartDate.getCurrentMinute()) {
        theTime = theNumber;
        break;
    }
}
于 2013-10-05T17:20:37.310 回答
0

您可以以编程方式执行此操作。

pickStartTime = (TimePicker)findViewById(R.id.StartTime);
pickStartTime.setOnTimeChangedListener(mStartTimeChangedListener);
int nextMinute = 0;

接下来,设置OnTimeChangedListener如下图

private TimePicker.OnTimeChangedListener mStartTimeChangedListener =
    new TimePicker.OnTimeChangedListener() {
        public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
            updateDisplay(view, startDate, hourOfDay, minute);          
        }
    };

private TimePicker.OnTimeChangedListener mNullTimeChangedListener =
    new TimePicker.OnTimeChangedListener() {
        public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {}
    };

和,

private void updateDisplay(TimePicker timePicker, Date date, int hourOfDay, int minute) 
{ 
    nextMinute = nextMinute+5;

    // remove ontimechangedlistener to prevent stackoverflow/infinite loop
    timePicker.setOnTimeChangedListener(mNullTimeChangedListener);

    // set minute
    timePicker.setCurrentMinute(nextMinute);

    // look up ontimechangedlistener again
    timePicker.setOnTimeChangedListener(mStartTimeChangedListener);

    // update the date variable for use elsewhere in code
    date.setMinutes(nextMinute);  
}
于 2013-04-24T08:53:15.720 回答
0

作为@Andrey Kotlin 解决方案的后续,您可以使其可扩展以指定任何给定的分钟间隔。此外,使用 kotlin 范围和step关键字,您可以编写更花哨的代码:

private fun setupMinutesPicker(minVal: Int, maxVal: Int) {
    minsNumberPicker.displayedValues = null

    minsNumberPicker.minValue = minVal / MINUTE_INTERVAL_STEP
    minsNumberPicker.maxValue = maxVal / MINUTE_INTERVAL_STEP

    minsNumberPicker.displayedValues = (minVal..maxVal step MINUTE_INTERVAL_STEP)
        .toList()
        .map { mins -> FORMATTER.format(mins) }
        .toTypedArray()
}
于 2020-06-03T12:18:09.563 回答