TimePicker in PreferenceScreen TimePicker in PreferenceScreen android android

TimePicker in PreferenceScreen


There is no TimePreference built into Android. However, creating your own is fairly easy. Here's one I did:

import android.content.Context;import android.content.res.TypedArray;import android.preference.DialogPreference;import android.util.AttributeSet;import android.view.View;import android.widget.TimePicker;public class TimePreference extends DialogPreference {    private int lastHour=0;    private int lastMinute=0;    private TimePicker picker=null;    public static int getHour(String time) {        String[] pieces=time.split(":");        return(Integer.parseInt(pieces[0]));    }    public static int getMinute(String time) {        String[] pieces=time.split(":");        return(Integer.parseInt(pieces[1]));    }    public TimePreference(Context ctxt, AttributeSet attrs) {        super(ctxt, attrs);        setPositiveButtonText("Set");        setNegativeButtonText("Cancel");    }    @Override    protected View onCreateDialogView() {        picker=new TimePicker(getContext());        return(picker);    }    @Override    protected void onBindDialogView(View v) {        super.onBindDialogView(v);        picker.setCurrentHour(lastHour);        picker.setCurrentMinute(lastMinute);    }    @Override    protected void onDialogClosed(boolean positiveResult) {        super.onDialogClosed(positiveResult);        if (positiveResult) {            lastHour=picker.getCurrentHour();            lastMinute=picker.getCurrentMinute();            String time=String.valueOf(lastHour)+":"+String.valueOf(lastMinute);            if (callChangeListener(time)) {                persistString(time);            }        }    }    @Override    protected Object onGetDefaultValue(TypedArray a, int index) {        return(a.getString(index));    }    @Override    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {        String time=null;        if (restoreValue) {            if (defaultValue==null) {                time=getPersistedString("00:00");            }            else {                time=getPersistedString(defaultValue.toString());            }        }        else {            time=defaultValue.toString();        }        lastHour=getHour(time);        lastMinute=getMinute(time);    }}


I have modified the code from first answer:

  • it stores selected time in long form (milliseconds) which is easier to work with (using Calendar) then string
  • it automatically shows selected time in summary field in user's format (12 or 24 hour)

Updated code:

public class TimePreference extends DialogPreference {    private Calendar calendar;    private TimePicker picker = null;    public TimePreference(Context ctxt) {        this(ctxt, null);    }    public TimePreference(Context ctxt, AttributeSet attrs) {        this(ctxt, attrs, android.R.attr.dialogPreferenceStyle);    }    public TimePreference(Context ctxt, AttributeSet attrs, int defStyle) {        super(ctxt, attrs, defStyle);        setPositiveButtonText(R.string.set);        setNegativeButtonText(R.string.cancel);        calendar = new GregorianCalendar();    }    @Override    protected View onCreateDialogView() {        picker = new TimePicker(getContext());        return (picker);    }    @Override    protected void onBindDialogView(View v) {        super.onBindDialogView(v);        picker.setCurrentHour(calendar.get(Calendar.HOUR_OF_DAY));        picker.setCurrentMinute(calendar.get(Calendar.MINUTE));    }    @Override    protected void onDialogClosed(boolean positiveResult) {        super.onDialogClosed(positiveResult);        if (positiveResult) {            calendar.set(Calendar.HOUR_OF_DAY, picker.getCurrentHour());            calendar.set(Calendar.MINUTE, picker.getCurrentMinute());            setSummary(getSummary());            if (callChangeListener(calendar.getTimeInMillis())) {                persistLong(calendar.getTimeInMillis());                notifyChanged();            }        }    }    @Override    protected Object onGetDefaultValue(TypedArray a, int index) {        return (a.getString(index));    }    @Override    protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {        if (restoreValue) {            if (defaultValue == null) {                calendar.setTimeInMillis(getPersistedLong(System.currentTimeMillis()));            } else {                calendar.setTimeInMillis(Long.parseLong(getPersistedString((String) defaultValue)));            }        } else {            if (defaultValue == null) {                calendar.setTimeInMillis(System.currentTimeMillis());            } else {                calendar.setTimeInMillis(Long.parseLong((String) defaultValue));            }        }        setSummary(getSummary());    }    @Override    public CharSequence getSummary() {        if (calendar == null) {            return null;        }        return DateFormat.getTimeFormat(getContext()).format(new Date(calendar.getTimeInMillis()));    }} 


For those whom the implementation of a custom Preference isn't so obvious (like it wasn't for me), you have to add this to your preferences.xml or whatever you're calling it.

You'll end up with something like this:

<?xml version="1.0" encoding="utf-8"?><PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android" >    <EditTextPreference        android:key="editTextPref_Key"        android:title="@string/editTextPref_title"/>    <com.example.myapp.TimePreference        android:key="timePrefA_Key"        android:title="@string/timePrefA_title"/>        <com.example.myapp.TimePreference        android:key="timePrefB_Key"        android:title="@string/timePrefB_title"/></PreferenceScreen>

Assuming you added the TimePreference to your own root package:
(src/com/example/myapp/TimePreference.java)