Ich habe viele Beispiele für eine ähnliche Frage zu SO gefunden, aber leider entspricht keine Antwort meinen Anforderungen.
Ich habe unterschiedliche Layouts für Hoch- und Querformat und verwende einen Backstack, der mich daran hindert setRetainState()
, Konfigurationsänderungsroutinen zu verwenden, und Tricks verwendet.
Ich zeige dem Benutzer bestimmte Informationen in TextViews an, die nicht im Standardhandler gespeichert werden. Beim Schreiben meiner Bewerbung ausschließlich mit Aktivitäten hat Folgendes gut funktioniert:
TextView vstup;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.whatever);
vstup = (TextView)findViewById(R.id.whatever);
/* (...) */
}
@Override
public void onSaveInstanceState(Bundle state) {
super.onSaveInstanceState(state);
state.putCharSequence(App.VSTUP, vstup.getText());
}
@Override
public void onRestoreInstanceState(Bundle state) {
super.onRestoreInstanceState(state);
vstup.setText(state.getCharSequence(App.VSTUP));
}
Mit Fragment
s funktioniert dies nur in sehr spezifischen Situationen. Was schrecklich bricht, ist insbesondere, ein Fragment zu ersetzen, es in den hinteren Stapel zu legen und dann den Bildschirm zu drehen, während das neue Fragment angezeigt wird. Soweit ich verstanden habe, erhält das alte Fragment beim Ersetzen keinen Aufruf, onSaveInstanceState()
bleibt aber irgendwie mit dem verbunden, Activity
und diese Methode wird später aufgerufen, wenn View
sie nicht mehr existiert. Suchen Sie also nach einem meiner TextView
Ergebnisse in a NullPointerException
.
Außerdem fand ich, dass es TextViews
bei Fragment
s keine gute Idee ist , den Verweis auf my zu behalten , auch wenn es bei s in Ordnung war Activity
. In diesem Fall wird onSaveInstanceState()
der Status tatsächlich gespeichert, aber das Problem tritt erneut auf, wenn ich den Bildschirm zweimal drehe, wenn das Fragment ausgeblendet ist, da onCreateView()
es in der neuen Instanz nicht aufgerufen wird.
Ich dachte an den Staat bei der Rettung onDestroyView()
in einem gewissen Bundle
Typ Klasse Mitglied Element (es ist eigentlich mehr Daten, nicht nur ein TextView
) und Speicher dass in , onSaveInstanceState()
aber es gibt auch andere Nachteile. In erster Linie, wenn das Fragment wird zur Zeit gezeigt, die um die beiden Funktionen des Aufrufs wird umgekehrt, so dass ich zu Konto für zwei verschiedene Situationen brauchen würde. Es muss eine sauberere und korrekte Lösung geben!