habe ich weiß, ich bin ein wenig spät, um die Partei, aber da dieses Problem noch, ich existiert fühle, dass es eine wirkliche Antwort verdient.
Von dem, was ich an anderer Stelle gelesen habe, hat das Problem mit den einzelnen Nummernfeldern des TimePicker alle mit genau der gleichen ID zu tun. Der Grund dafür ist, dass, wenn Sie den Bildschirm drehen, Android alle Ihre Dialoge schließt, öffnet alle Ihre Dialoge mit dem typischen onCreateDialog -> onPrepareDialog, und dann, am wichtigsten, , nachdem Sie Ihre Dialoge gemacht haben, geht es zurück und stellt wieder her, was früher da war. Das bedeutet, dass egal was Sie vorher tun, Android wird kommen und brechen Sie Ihre TimePicker.
Die Antwort, obwohl nicht die schönste Option, ist nach Androiden zu kommen und es wieder einzustellen.
Hier ist, wie ich es getan hätte, habe ich einfach meinen eigenen Timepicker gemacht:
public class MyTimePicker extends TimePicker {
public MyTimePicker(Context context) {
super(context);
}
public MyTimePicker(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyTimePicker(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
private final static String B_MIN = "bMin";
private final static String B_HOUR = "bHour";
private final static String B_SUPER = "bSuper";
// here's the first key, we're going to override how the TimePicker saves
// its state
@Override
public Parcelable onSaveInstanceState() {
Bundle bundle = new Bundle();
bundle.putParcelable(B_SUPER, super.onSaveInstanceState());
bundle.putInt(B_MIN, getCurrentMinute());
bundle.putInt(B_HOUR, getCurrentHour());
return bundle;
}
// this function gets called when we are restoring, but before android
// does its thing
@Override
public void onRestoreInstanceState(Parcelable state) {
if (state instanceof Bundle) {
final Bundle bundle = (Bundle) state;
super.onRestoreInstanceState(bundle.getParcelable(B_SUPER));
// here it is, not the prettiest option, but it gets the job done
// we simply wait 0.1 sec and then update the TimePicker
// since all of this happens in the same thread, its guarenteed to
// be after the android reset
// also, this handler gets the HandlerLeak warning, I don't
// think this can leak though seeing as it's only called once
// with a 100 ms delay
(new Handler() {
@Override
public void handleMessage(Message msg) {
setCurrentMinute(bundle.getInt(B_MIN));
setCurrentHour(bundle.getInt(B_HOUR));
}
}).sendEmptyMessageDelayed(0, 100);
return;
}
super.onRestoreInstanceState(state);
}
}
Und ja, der Handler ist erforderlich. Wenn Sie einfach die setCurrent-Befehle von onRestoreInstanceState ausführen, überschreibt Android Sie einfach.
Haben Sie jemals eine Antwort darauf erhalten? Ich habe das gleiche Problem. DialogPreference ist die Basisklasse und alle Antworten scheinen davon auszugehen, dass es sich um eine Aktivität handelt. Ich kann sehen, dass ich die Stunde einstelle, aber sie bleibt leer, bis Sie auf + oder - drücken, dann wird der Wert gespeichert. – user405821
Hallo @ user405821, ich fand dieses Verhalten auf meinem Gerät, das GingerBeard ausgeführt wird. Allerdings läuft die gleiche App auf JellyBean-Gerät, ist es nicht passiert. Ich erweitere DialogPreference und verwende TimePicker auf meiner PreferenceActivity (auf JellyBeans, PreferenceFragment). Ich kann dieses Problem noch nicht lösen. –
@ user405821 Ich habe eine Antwort hinzugefügt, die mein Problem gelöst hat und auch deine lösen kann. –