Limit Time Range in Time Picker

15,254

As in this answer: https://stackoverflow.com/a/20396673/4130107 You can create your custom TimePickerDialog and overwrite the onAttachedToWindow(); but instead limit the hour range:

private final boolean mIs24HourView;

public CustomTimePickerDialog(Context context, OnTimeSetListener callBack,
                              int hourOfDay, int minute, boolean is24HourView) {
    super(context, callBack, hourOfDay, minute, is24HourView);
    mIs24HourView = is24HourView;
}

@Override
public void onAttachedToWindow() {
    super.onAttachedToWindow();
    try {
        Class<?> classForid = Class.forName("com.android.internal.R$id");
        Field timePickerField = classForid.getField("timePicker");
        this.timePicker = (TimePicker) findViewById(timePickerField
                .getInt(null));
        Field field = classForid.getField("hour");


        final NumberPicker mHourSpinner = (NumberPicker) timePicker
                .findViewById(field.getInt(null));

        if (mIs24HourView) {
            mHourSpinner.setMinValue(2);
            mHourSpinner.setMaxValue(20);
        }else {
            Field amPm = classForid.getField("amPm");

            mHourSpinner.setMinValue(2);
            final NumberPicker amPm = (NumberPicker) timePicker
                    .findViewById(amPm.getInt(null));
            amPm.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
                @Override
                public void onValueChange(NumberPicker np1, int oldVal, int newVal) {
                    if (newVal == 0) { // case AM
                        mHourSpinner.setMinValue(2);
                        mHourSpinner.setMaxValue(12);
                    } else { // case PM
                        mHourSpinner.setMinValue(1);
                        mHourSpinner.setMaxValue(8);
                    }
                }
            });

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

}

EDIT: now working for AM/PM too

enter image description here

Share:
15,254
Sun
Author by

Sun

Updated on June 04, 2022

Comments

  • Sun
    Sun almost 2 years

    How to control TimePicker, I just want to show time range in time picker from 08:00 am to 02:00 pm (except from 08:00 am to 02:00 pm hide all)

    I have written complete code to show TimePicker, and customized time as well.

    Here is my code:

             case DIALOG_TIME:
                final Calendar c = Calendar.getInstance();
                int hour = c.get(Calendar.HOUR_OF_DAY);
                int minute = c.get(Calendar.MINUTE);
    
                // Create a new instance of TimePickerDialog and return it
                return new TimePickerDialog(this, lisTime, hour, minute,
                DateFormat.is24HourFormat(MainActivity.this));
    
            TimePickerDialog.OnTimeSetListener lisTime = new TimePickerDialog.OnTimeSetListener() {
    
            @Override
            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                // TODO Auto-generated method stub
                String meridiem = "";
                nim = minute;
                Calendar datetime = Calendar.getInstance();
                datetime.set(Calendar.HOUR_OF_DAY, hourOfDay);
                datetime.set(Calendar.MINUTE, minute);
    
                if (datetime.get(Calendar.AM_PM) == Calendar.AM)
                    meridiem = "AM";
                else if (datetime.get(Calendar.AM_PM) == Calendar.PM)
                    meridiem = "PM";
    
                hour = (datetime.get(Calendar.HOUR) == 0) ?"12":String.valueOf(datetime.get(Calendar.HOUR));
    
                String time = pad(Integer.parseInt(hour)) + ":" + pad(minute) + " " + meridiem;
                editTime.setText(time);
    
            }
        };
    
        private String pad(int value){
    
            if(value<10){
                return "0"+value;
            }
    
            return ""+value;
        }