Skip to content

Instantly share code, notes, and snippets.

@nickaknudson
Last active May 10, 2021 04:16
Show Gist options
  • Select an option

  • Save nickaknudson/5024416 to your computer and use it in GitHub Desktop.

Select an option

Save nickaknudson/5024416 to your computer and use it in GitHub Desktop.
TimePicker DialogPreference for Android
package com.xxx.xxx.preference;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
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;
// Based on http://stackoverflow.com/a/7484289/922168
public class TimePreference extends DialogPreference {
private int mHour = 0;
private int mMinute = 0;
private TimePicker picker = null;
private final String DEFAULT_VALUE = "00:00";
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 context) {
this(context, null);
}
public TimePreference(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public TimePreference(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
setPositiveButtonText("Set");
setNegativeButtonText("Cancel");
}
public void setTime(int hour, int minute) {
mHour = hour;
mMinute = minute;
String time = toTime(mHour, mMinute);
persistString(time);
notifyDependencyChange(shouldDisableDependents());
notifyChanged();
}
public String toTime(int hour, int minute) {
return String.valueOf(hour) + ":" + String.valueOf(minute);
}
public void updateSummary() {
String time = String.valueOf(mHour) + ":" + String.valueOf(mMinute);
setSummary(time24to12(time));
}
@Override
protected View onCreateDialogView() {
picker = new TimePicker(getContext());
return picker;
}
@Override
protected void onBindDialogView(View v) {
super.onBindDialogView(v);
picker.setCurrentHour(mHour);
picker.setCurrentMinute(mMinute);
}
@Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
if (positiveResult) {
int currHour = picker.getCurrentHour();
int currMinute = picker.getCurrentMinute();
if (!callChangeListener(toTime(currHour, currMinute))) {
return;
}
// persist
setTime(currHour, currMinute);
updateSummary();
}
}
@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
return a.getString(index);
}
@Override
protected void onSetInitialValue(boolean restorePersistedValue, Object defaultValue) {
String time = null;
if (restorePersistedValue) {
if (defaultValue == null) {
time = getPersistedString(DEFAULT_VALUE);
}
else {
time = getPersistedString(DEFAULT_VALUE);
}
}
else {
time = defaultValue.toString();
}
int currHour = getHour(time);
int currMinute = getMinute(time);
// need to persist here for default value to work
setTime(currHour, currMinute);
updateSummary();
}
public static Date toDate(String inTime) {
try {
DateFormat inTimeFormat = new SimpleDateFormat("HH:mm", Locale.US);
return inTimeFormat.parse(inTime);
} catch(ParseException e) {
return null;
}
}
public static String time24to12(String inTime) {
Date inDate = toDate(inTime);
if(inDate != null) {
DateFormat outTimeFormat = new SimpleDateFormat("hh:mm a", Locale.US);
return outTimeFormat.format(inDate);
} else {
return inTime;
}
}
}
@PRosenb

PRosenb commented Aug 10, 2014

Copy link
Copy Markdown

Better remove the constructor with three arguments

TimePreference(Context context, AttributeSet attrs, int defStyle)

and use super() in the one with two:

public TimePreference(Context context, AttributeSet attrs) {
  super(context, attrs);
  setPositiveButtonText("Set");
  setNegativeButtonText("Cancel");
}

Otherwise the title is not displayed correctly.

@savanpatel

Copy link
Copy Markdown

I am using this code for setting notification time. My question is how can I read these values like 1:00 AM from another activity?

@abunayem

Copy link
Copy Markdown

compatibility issue with android X

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment