Search code examples
androidtimepicker

Android TimePickerDialog set max time


I'm looking for a way to set the maximun and minimun time pickable on an Android TimePickerDialog, and to change the default minute interval from 1 min to 5 min,

I thought that was an easy one, but I can't find a way !


Solution

  • THIS ANSWER IS OUTDATED

    It will not work on Android 5 or higher.


    This is an extension to fiddlers answer. Somehow the onTimeChangedListener is not set by TimePickerDialog in some Android Versions:

    ex. http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.2.1_r1.2/android/app/TimePickerDialog.java

    The onTimeChanged methode therefor is never called! Best solution for this issue currently, is propably to code a custom TimePickerDialog with the min/max logic from fiddler.

    The more ugly work around is this. (Adding the listener using reflections) I also update the title to show the currently selected time.

    package com.mysuger.android.dialogs;
    
    import java.lang.reflect.Field;
    import java.text.DateFormat;
    import java.util.Calendar;
    
    import android.app.TimePickerDialog;
    import android.content.Context;
    import android.widget.TimePicker;
    
    /**
     * A time dialog that allows setting a min and max time.
     * 
     */
    public class RangeTimePickerDialog extends TimePickerDialog {
    
    private int minHour = -1;
    private int minMinute = -1;
    
    private int maxHour = 25;
    private int maxMinute = 25;
    
    private int currentHour = 0;
    private int currentMinute = 0;
    
    private Calendar calendar = Calendar.getInstance();
    private DateFormat dateFormat;
    
    
    public RangeTimePickerDialog(Context context, OnTimeSetListener callBack, int hourOfDay, int minute, boolean is24HourView) {
        super(context, callBack, hourOfDay, minute, is24HourView);
        currentHour = hourOfDay;
        currentMinute = minute;
        dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT);
    
        try {
            Class<?> superclass = getClass().getSuperclass();
            Field mTimePickerField = superclass.getDeclaredField("mTimePicker");
            mTimePickerField.setAccessible(true);
            TimePicker mTimePicker = (TimePicker) mTimePickerField.get(this);
            mTimePicker.setOnTimeChangedListener(this);
        } catch (NoSuchFieldException e) {
        } catch (IllegalArgumentException e) {
        } catch (IllegalAccessException e) {
        }
    }
    
    public void setMin(int hour, int minute) {
        minHour = hour;
        minMinute = minute;
    }
    
    public void setMax(int hour, int minute) {
        maxHour = hour;
        maxMinute = minute;
    }
    
    @Override
    public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
    
        boolean validTime = true;
        if (hourOfDay < minHour || (hourOfDay == minHour && minute < minMinute)){
            validTime = false;
        }
    
        if (hourOfDay  > maxHour || (hourOfDay == maxHour && minute > maxMinute)){
            validTime = false;
        }
    
        if (validTime) {
            currentHour = hourOfDay;
            currentMinute = minute;
        }
    
        updateTime(currentHour, currentMinute);
        updateDialogTitle(view, currentHour, currentMinute);
    }
    
    private void updateDialogTitle(TimePicker timePicker, int hourOfDay, int minute) {
        calendar.set(Calendar.HOUR_OF_DAY, hourOfDay);
        calendar.set(Calendar.MINUTE, minute);
        String title = dateFormat.format(calendar.getTime());
        setTitle(title);
    }
     }