1

I was trying to set the hour and minute in the TimePicker and I found that it seems that there is a minimum number of items required in the NumberPicker for the values to wrap around.

How do I set the number of items to lesser than the default if I don't have so many values (got only 4: "00", "15", "30" and "45")?

The image below shows the hours as correct but the minutes as wrong. I need the minutes to wrap around (i.e. "45" before "00") like the hours.

enter image description here

Here is my code:

@SuppressLint("NewApi")
private void setTimePickerInterval(TimePicker timePicker) {
    try {
        Class<?> classForid = Class.forName("com.android.internal.R$id");

        Field fieldHr = classForid.getField("hour");
        mHourPicker = (NumberPicker) timePicker.findViewById(fieldHr.getInt(null));

        //set hours from 9am to 7pm (opening hours)
        mHourPicker.setMinValue(0);
        mHourPicker.setMaxValue(10);
        mDisplayedValuesHr = new ArrayList<String>();

        for (int i = 9; i < 20; i++) {
            mDisplayedValuesHr.add(String.format("%02d", i));
        }

        mHourPicker.setDisplayedValues(mDisplayedValuesHr.toArray(new String[0]));

        Field fieldMin = classForid.getField("minute");
        mMinutePicker = (NumberPicker) timePicker.findViewById(fieldMin.getInt(null));

        //set minutes in 15 mins interval
        mMinutePicker.setMinValue(0);
        mMinutePicker.setMaxValue(3);
        mDisplayedValuesMin = new ArrayList<String>();

        for (int i = 0; i < 60; i += TIME_PICKER_INTERVAL) {
            mDisplayedValuesMin.add(String.format("%02d", i));
        }

        mMinutePicker.setDisplayedValues(mDisplayedValuesMin.toArray(new String[0]));

    } catch (Exception e) {
        e.printStackTrace();
    }
}
halfer
  • 19,824
  • 17
  • 99
  • 186
yeeen
  • 4,911
  • 11
  • 52
  • 73
  • Note that this piece of code will run into problem with real values vs displayed values. For a follow up, see http://stackoverflow.com/questions/33626318/calendar-gettimeinmillis-difference-of-1-hour – yeeen Nov 11 '15 at 23:18

1 Answers1

2

You can explicitly call setWrapSelectorWheel (boolean) to trigger the private method updateWrapSelectorWheel of NumberPicker:

@SuppressLint("NewApi")
private void setTimePickerInterval(TimePicker timePicker) {
    try {
        Class<?> classForid = Class.forName("com.android.internal.R$id");

        Field fieldHr = classForid.getField("hour");
        mHourPicker = (NumberPicker) timePicker.findViewById(fieldHr.getInt(null));

        //set hours from 9am to 7pm (opening hours)
        mHourPicker.setMinValue(0);
        mHourPicker.setMaxValue(10);
        mDisplayedValuesHr = new ArrayList<String>();

        for (int i = 9; i < 20; i++) {
            mDisplayedValuesHr.add(String.format("%02d", i));
        }

        mHourPicker.setDisplayedValues(mDisplayedValuesHr.toArray(new String[0]));

        Field fieldMin = classForid.getField("minute");
        mMinutePicker = (NumberPicker) timePicker.findViewById(fieldMin.getInt(null));

        //set minutes in 15 mins interval
        mMinutePicker.setMinValue(0);
        mMinutePicker.setMaxValue(3);
        mDisplayedValuesMin = new ArrayList<String>();

        for (int i = 0; i < 60; i += TIME_PICKER_INTERVAL) {
            mDisplayedValuesMin.add(String.format("%02d", i));
        }

        mMinutePicker.setDisplayedValues(mDisplayedValuesMin.toArray(new String[0]));
        mMinutePicker.setWrapSelectorWheel(true);

    } catch (Exception e) {
        e.printStackTrace();
    }
}
Mattia Maestrini
  • 32,270
  • 15
  • 87
  • 94
  • `classForid.getField("hour")` - For me this part throws an exception with message there is no field with name `hour`. Any chance you might know why? – Yupi Feb 02 '22 at 10:21