TimePicker im PreferenceScreen

78

Ich möchte Intervalein TimePickerEinstellungsfeld mm:ssmit dem Namen erstellen und möchte in der Lage sein, ein Popup-Fenster mit einem minimalen Wert 00:30und einem Schritt von 30 Sekunden zu öffnen .

Ist es möglich , die Verwendung TimePickerin PreferenceScreen?

hsz
quelle

Antworten:

151

In Android ist kein TimePreference integriert. Es ist jedoch ziemlich einfach, eigene zu erstellen. Hier ist eine, die ich gemacht habe :

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);
    }
}
CommonsWare
quelle
1
@ Jesse: getCurrentHour()sollte einen Wert von 0 bis 23 zurückgeben.
CommonsWare
2
Dies ist praktisch, um sicherzustellen, dass eingegebene Werte zusammen mit den vom Spinner ausgewählten Werten erfasst werden
Anthony Nolan
2
@input: Die Implementierung in dieser Frage speichert die Zeit als Zeichenfolge im HH:MMFormat. Eine andere Antwort in dieser Frage hat eine alternative Version, die die Zeit so lange speichert.
CommonsWare
1
@input: Schlägt mich; Ich habe mir dieses Szenario nie angesehen. Die Voreinstellung sollte unabhängig davon gespeichert werden, wann der Dialog gesendet wird.
CommonsWare
1
@juned: Das würdest du nicht brauchen TimePreference. Erstellen Sie einfach eine DialogFragmentum die TimePickerDialogoder verwenden Sie die ältere Funktion für verwaltete Dialoge, wenn Sie keine Fragmente verwenden. Hier ist eine DialogFragmentBeispiel-App (obwohl eine AlertDialoganstelle einer erstellt TimePickerDialog): github.com/commonsguy/cw-omnibus/tree/master/Dialogs/…
CommonsWare
72

Ich habe den Code von der ersten Antwort an geändert:

  • Es speichert die ausgewählte Zeit in langer Form (Millisekunden), die einfacher zu bearbeiten ist (mithilfe des Kalenders), als als Zeichenfolge
  • Die ausgewählte Zeit wird automatisch im Zusammenfassungsfeld im Benutzerformat angezeigt (12 oder 24 Stunden).

Aktualisierter 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()));
    }
} 
David Vávra
quelle
2
Großartig, aber wie liefern Sie einen Standardwert in einem numerischen Format? Wenn ich android: defaultValue = "3600000" verwende, ist der defaultValue ein String, daher muss er zuerst auf Long analysiert werden.
Mark
1
@Destil ich bekomme Klasse Cast Ausnahme in OnsetInitialValue ... jede mögliche Abhilfe
.. Danke
3
Gute Antwort, abgesehen von einem kleinen Problem. Wenn restoreValue == falsedann müssen Sie persistLong(calendar.getTimeInMillis());als letzte Zeile im Codeblock aufrufen . Andernfalls PreferenceManager.setDefaultValues(...)funktioniert es nicht wie erwartet und PreferenceManager.getDefaultSharedPreferences(this).getLong(...)gibt den Standardwert nur zurück, wenn er tatsächlich in den Einstellungen ausgewählt wurde.
Zelanix
4
Wenn Sie Probleme mit dem Textstil haben, der sich von anderen Einstellungen unterscheidet, ändern Sie den Konstruktor mit zwei Argumenten, um stattdessen den internen Android-Stil zu verwenden 0. Änderung:this(context, attrs, android.R.attr.dialogPreferenceStyle);
Tautvydas
2
Könnten Sie bitte implementieren, wie Sie getHour, getMinute dieser Klasse erhalten? Vielen Dank
Hoang Trinh
56

Für diejenigen, bei denen die Implementierung einer benutzerdefinierten Voreinstellung nicht so offensichtlich ist (wie bei mir nicht), müssen Sie diese zu Ihrer preferences.xmloder wie auch immer Sie sie nennen , hinzufügen .

Sie werden am Ende so etwas haben:

<?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>

Angenommen, Sie haben die TimePreference zu Ihrem eigenen Root-Paket hinzugefügt:
( src/com/example/myapp/TimePreference.java)

Sikora
quelle
Wie rufe ich den Wert von TimePreference in einer anderen Klasse ab? Ich habe es so codiert: hora_inicio = Integer.parseInt(sharedPrefs.getString("hora_inicio", "0"));aber ich bin mir nicht sicher, ob es so heißen soll?
Eingabe
1
@input Ich bin mir nicht sicher, ob dies das ist, wonach Sie suchen, aber hier ist es: SharedPreferences prefs; prefs = PreferenceManager.getDefaultSharedPreferences(this); String[] pieces = refs.getString("hora_inicio","08:00").split(":"); Das zweite Argument ist der Standardwert, wenn es nicht festgelegt ist.
Sikora
3
Es wurde die Präferenz wie angegeben hinzugefügt, die wie ein Zauber wirkt (danke dafür). Der Stil der Vorzugstexte unterscheidet sich jedoch von den anderen, dh in der Übersicht der Titel und Zusammenfassungen sieht die Schrift größer aus und es scheint ein Rand hinzugefügt zu werden. Irgendwelche Ideen, wie man das ändern kann?
Gabri van Lee
1
Verwenden Sie dies als zweiten Konstruktor: public TimePreference (Context mContext, AttributeSet mAttributeSet) {this (mContext, mAttributeSet, android.R.attr.preferenceStyle); }
John P.
07-16 15:33:41.689: W/ResourceType(9228): Failure getting entry for 0x010802c9 (t=7 e=713) in package 0 (error -75)
Bekommt noch
30

Für Preferences Support Libraryunterschiedlichen Code wird benötigt. Es erfordert zwei benutzerdefinierte Klassen TimePreferenceund TimePreferenceDialogFragmentCompatsowie das Überschreiben der onDisplayPreferenceDialogMethode in der PreferenceFragmentCompatErweiterungsklasse.


TimePreference.java

package com.test;

import android.content.Context;
import android.content.res.TypedArray;
import android.support.v7.preference.DialogPreference;
import android.util.AttributeSet;

public class TimePreference extends DialogPreference
{
    public int hour = 0;
    public int minute = 0;

    public static int parseHour(String value)
    {
        try
        {
            String[] time = value.split(":");
            return (Integer.parseInt(time[0]));
        }
        catch (Exception e)
        {
            return 0;
        }
    }

    public static int parseMinute(String value)
    {
        try
        {
            String[] time = value.split(":");
            return (Integer.parseInt(time[1]));
        }
        catch (Exception e)
        {
            return 0;
        }
    }

    public static String timeToString(int h, int m)
    {
        return String.format("%02d", h) + ":" + String.format("%02d", m);
    }

    public TimePreference(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    @Override
    protected Object onGetDefaultValue(TypedArray a, int index)
    {
        return a.getString(index);
    }

    @Override
    protected void onSetInitialValue(boolean restoreValue, Object defaultValue)
    {
        String value;
        if (restoreValue)
        {
            if (defaultValue == null) value = getPersistedString("00:00");
            else value = getPersistedString(defaultValue.toString());
        }
        else
        {
            value = defaultValue.toString();
        }

        hour = parseHour(value);
        minute = parseMinute(value);
    }

    public void persistStringValue(String value)
    {
        persistString(value);
    }
}

TimePreferenceDialogFragmentCompat.java

package com.test;

import android.content.Context;
import android.support.v7.preference.DialogPreference;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceDialogFragmentCompat;
import android.view.View;
import android.widget.TimePicker;

public class TimePreferenceDialogFragmentCompat extends PreferenceDialogFragmentCompat implements DialogPreference.TargetFragment
{
    TimePicker timePicker = null;

    @Override
    protected View onCreateDialogView(Context context)
    {
        timePicker = new TimePicker(context);
        return (timePicker);
    }

    @Override
    protected void onBindDialogView(View v)
    {
        super.onBindDialogView(v);
        timePicker.setIs24HourView(true);
        TimePreference pref = (TimePreference) getPreference();
        timePicker.setCurrentHour(pref.hour);
        timePicker.setCurrentMinute(pref.minute);
    }

    @Override
    public void onDialogClosed(boolean positiveResult)
    {
        if (positiveResult)
        {
            TimePreference pref = (TimePreference) getPreference();
            pref.hour = timePicker.getCurrentHour();
            pref.minute = timePicker.getCurrentMinute();

            String value = TimePreference.timeToString(pref.hour, pref.minute);
            if (pref.callChangeListener(value)) pref.persistStringValue(value);
        }
    }

    @Override
    public Preference findPreference(CharSequence charSequence)
    {
        return getPreference();
    }
}

Erforderliche Änderungen in der PreferenceFragmentCompatErweiterungsklasse

    public static class PreferencesFragment extends PreferenceFragmentCompat
    {
       ....

        @Override
        public void onDisplayPreferenceDialog(Preference preference)
        {
            DialogFragment dialogFragment = null;
            if (preference instanceof TimePreference)
            {
                dialogFragment = new TimePreferenceDialogFragmentCompat();
                Bundle bundle = new Bundle(1);
                bundle.putString("key", preference.getKey());
                dialogFragment.setArguments(bundle);
            }

            if (dialogFragment != null)
            {
                dialogFragment.setTargetFragment(this, 0);
                dialogFragment.show(this.getFragmentManager(), "android.support.v7.preference.PreferenceFragment.DIALOG");
            }
            else
            {
                super.onDisplayPreferenceDialog(preference);
            }
        }
    }

Mit dem obigen Code kann die Zeiteinstellung in einer solchen XML-Einstellungsdatei verwendet werden

<com.test.TimePreference
    android:key="some_time"
    android:title="Set some time"
    android:defaultValue="12:00"
    android:summary="Set some time"/>
Dalija Prasnikar
quelle
Wenn ich 2 davon hinzufüge, wird nach dem Einstellen der 1. Zeitreferenz die Zeit der 2. Zeitreferenz auf dieselbe eingestellt. Wie kann ich zwischen zwei Zeitreferenzen unterscheiden?
Alex
Gelöst, vergessen, den Schlüssel zu ändern.
Alex
Funktioniert wie Charme!
IYonatan
1
@JulianDelphiki Wie ich bereits in der ersten Zeile meiner Antwort sagte, erfordert die Preferences Support Library einen anderen Code. Andere Lösungen funktionieren für reguläre Präferenzklassen.
Dalija Prasnikar
1
Mehr als perfekt!! Wird verwendet, um eine benutzerdefinierte Datumsauswahl für eine Datumseinstellung mit Xamarin zu erstellen. Verwenden Sie auch die PreferenceManagerder Support-Bibliothek, um Standardwerte festzulegen, z. B. inPreferenceManager.SetDefaultValues(context, resId, readAgain)
Elisabeth
5

Die Lösung von CommonsWare weist einige Probleme auf, die ich behoben habe:

  • Das Feld wird nach dem Ändern nicht ordnungsgemäß aktualisiert
  • Der Minutenwert bleibt nur eine einzelne Ziffer, z. B. 10: 2 anstelle von 10:02
  • Wenn Sie PreferenceManager.setDefaultPreferences verwenden, um anfängliche Standardeinstellungen in Ihrer App festzulegen, funktioniert dies nicht, da onSetInitialValue diese beibehalten muss
  • Die Formatierung des Ergebnisses ist nicht auf das Gebietsschema des Benutzers zugeschnitten (z. B. verwenden die USA AM / PM).

Hier ist mein Code, viel Spaß.

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();

            setSummary(getSummary());

            String lastMinuteString = String.valueOf(lastMinute);
            String time = String.valueOf(lastHour) + ":" + (lastMinuteString.length() == 1 ? "0" + lastMinuteString : lastMinuteString);

            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;
        String defaultValueStr = (defaultValue != null) ? defaultValue.toString() : "00:00";
        if (restoreValue)
            time = getPersistedString(defaultValueStr);
        else {
            time = defaultValueStr;
            if (shouldPersist())
                persistString(defaultValueStr);
        }

        lastHour=getHour(time);
        lastMinute=getMinute(time);

        setSummary(getSummary());
    }

    @Override
    public CharSequence getSummary() {

        Calendar cal = Calendar.getInstance();
        cal.set(Calendar.HOUR_OF_DAY, lastHour);
        cal.set(Calendar.MINUTE, lastMinute);
        DateFormat sdf = SimpleDateFormat.getTimeInstance(SimpleDateFormat.SHORT);

        return sdf.format(cal.getTime());
    }

}
Matt Koala
quelle
4

füge dies für die Zusammenfassung hinzu:

@Override
public CharSequence getSummary() {
    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.YEAR, Calendar.MONTH, Calendar.DAY_OF_MONTH, lastHour, lastMinute);
    return DateFormat.getTimeFormat(getContext()).format(new Date(cal.getTimeInMillis()));
}

und hinzufügen

setSummary(getSummary());

bis zum Ende von onSetInitialValue und onDialogClosed .

Omid Omidi
quelle
1

Ich habe die CommonsWare-Antwort geändert, um die JodaTime-Bibliothek zu verwenden:

import android.content.Context;
import android.content.res.TypedArray;
import android.preference.DialogPreference;
import android.support.annotation.NonNull;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TimePicker;

import org.joda.time.LocalTime;

public class TimePreference extends DialogPreference {
    private int lastHour;
    private int lastMinute;
    private TimePicker picker;

    public TimePreference(Context context, AttributeSet attrs) {
        super(context, attrs);

        setPositiveButtonText("Set");
        setNegativeButtonText("Cancel");
    }

    @Override
    protected View onCreateDialogView() {
        picker = new TimePicker(getContext());

        return(picker);
    }

    @Override
    protected void onBindDialogView(@NonNull 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();

            LocalTime localTime = new LocalTime(lastHour, lastMinute);
            String time = localTime.toString();

            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) {
        LocalTime time;

        if (restoreValue) {
            if (defaultValue == null) {
                time = LocalTime.parse(getPersistedString("08:00:00.000"));
            }
            else {
                time = LocalTime.parse(getPersistedString(defaultValue.toString()));
            }
        } else {
            time = LocalTime.parse(defaultValue.toString());
        }

        lastHour = time.getHourOfDay();
        lastMinute = time.getMinuteOfHour();
    }
}

Außerdem müssen Sie eine benutzerdefinierte Einstellung hinzufügen, wie Sikora sagte.

<?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>
Binoy Babu
quelle
1

Bei Android 6 sind "aktuelle Stunde" und "aktuelle Minute" veraltet. Verwenden Sie diese Option, um die Marshmallow-Kompatibilität sicherzustellen:

import android.content.Context;
import android.content.res.TypedArray;
import android.os.Build;
import android.preference.DialogPreference;
import android.util.AttributeSet;
import android.view.View;
import android.widget.TimePicker;

public class TimePreference extends DialogPreference {

private int lastHour;
private int lastMinute;
private TimePicker picker;

public TimePreference(Context ctx, AttributeSet attrs) {
    super(ctx, attrs);
    setPositiveButtonText(ctx.getString(android.R.string.ok));
    setNegativeButtonText(ctx.getString(android.R.string.cancel));
}

@Override
protected View onCreateDialogView() {
    picker = new TimePicker(getContext());
    picker.setIs24HourView(true);
    return picker;
}

@SuppressWarnings("deprecation")
@Override
protected void onBindDialogView(View v) {
    super.onBindDialogView(v);
    if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
        picker.setCurrentHour(lastHour);
        picker.setCurrentMinute(lastMinute);
    } else {
        picker.setHour(lastHour);
        picker.setMinute(lastMinute);
    }
}

@SuppressWarnings("deprecation")
@Override
protected void onDialogClosed(boolean positiveResult) {
    super.onDialogClosed(positiveResult);
    if (positiveResult) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            lastHour = picker.getCurrentHour();
            lastMinute = picker.getCurrentMinute();
        } else {
            lastHour = picker.getHour();
            lastMinute = picker.getMinute();
        }
        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;
    if (restoreValue) {
        if (defaultValue == null) {
            time = getPersistedString("00:00");
        } else {
            time = getPersistedString(defaultValue.toString());
        }
    } else {
        time = defaultValue.toString();
    }
    lastHour = getHour(time);
    lastMinute = getMinute(time);
}

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]);
}
}
0101100101
quelle
0

Wie LEO87 habe ich ClassCastException's gesehen. Das Problem war auf veraltete, persistente Daten eines früheren gleichnamigen Steuerelements zurückzuführen. Mögliche Lösungen sind das Löschen der App-Daten, die Verwendung eines anderen Namens (Schlüssels) oder die Ausnahme wie folgt, wenn Sie denselben Schlüsselnamen verwenden müssen:

@Override
protected void onSetInitialValue(boolean restoreValue, Object defaultValue) {
    if (restoreValue) {
        long persistedValue;
        try {
            persistedValue = getPersistedLong(System.currentTimeMillis());
        } catch (Exception e) {
            //Stale persisted data may be the wrong type
            persistedValue = System.currentTimeMillis();
        }
        calendar.setTimeInMillis(persistedValue);
    } else if (defaultValue != null) {
        calendar.setTimeInMillis(Long.parseLong((String) defaultValue));
    } else {
        //!restoreValue, defaultValue == null
        calendar.setTimeInMillis(System.currentTimeMillis());
    }

    setSummary(getSummary());
}
pmont
quelle