Znalazłem wiele przykładów podobnych pytań dotyczących SO, ale żadna odpowiedź niestety nie spełnia moich wymagań.
Mam różne układy dla portretu i krajobrazu i używam tylnego stosu, co zarówno uniemożliwia mi używanie, jak setRetainState()
i sztuczki przy użyciu procedur zmiany konfiguracji.
Wyświetlam pewne informacje użytkownikowi w TextViews, które nie są zapisywane w domyślnym module obsługi. Podczas pisania mojej aplikacji wyłącznie przy użyciu działań następujące działały dobrze:
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));
}
W przypadku Fragment
s działa to tylko w bardzo specyficznych sytuacjach. W szczególności, co strasznie się psuje, to zastępowanie fragmentu, umieszczanie go na tylnym stosie, a następnie obracanie ekranu podczas wyświetlania nowego fragmentu. Z tego, co zrozumiałem, stary fragment nie otrzymuje wywołania, onSaveInstanceState()
gdy jest zastępowany, ale pozostaje w jakiś sposób powiązany z, Activity
a ta metoda jest wywoływana później, gdy View
już nie istnieje, więc szukam dowolnego z moich TextView
wyników w NullPointerException
.
Odkryłem również, że zachowanie odniesienia do mojego TextViews
nie jest dobrym pomysłem w przypadku Fragment
s, nawet jeśli było w porządku z Activity
s. W takim przypadku onSaveInstanceState()
faktycznie zapisuje stan, ale problem pojawia się ponownie, jeśli obrócę ekran dwukrotnie, gdy fragment jest ukryty, ponieważ onCreateView()
nie zostanie wywołany w nowej instancji.
Myślałam o zapisaniu stanu w onDestroyView()
do pewnego Bundle
typu a elementem członkiem klasy (to faktycznie więcej danych, a nie tylko jeden TextView
) i zapisując to w onSaveInstanceState()
ale istnieją inne wady. Przede wszystkim, jeśli fragment jest obecnie wyświetlany, kolejność wywoływania dwóch funkcji jest odwrócona, więc musiałbym wziąć pod uwagę dwie różne sytuacje. Musi być czystsze i prawidłowe rozwiązanie!