Я знайшов багато випадків подібного питання щодо SO, але жодна відповідь, на жаль, не відповідає моїм вимогам.
У мене різні схеми для портретного та ландшафтного режиму, і я використовую задній стек, який і заважає мені використовувати, setRetainState()і хитрощі, використовуючи процедури зміни конфігурації.
Я показую певну інформацію користувачеві в TextViews, яка не зберігається в обробнику за замовчуванням. Коли я писав мою заявку виключно за допомогою "Діяльності", то добре працювало:
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));
}
З Fragments це працює лише у дуже конкретних ситуаціях. Зокрема, те, що жахливо ламається, - це заміна фрагмента, поміщення його в задній стек, а потім обертання екрана під час показу нового фрагмента. З того, що я зрозумів, старий фрагмент не отримує дзвінка, onSaveInstanceState()коли його замінюють, але залишається якимось чином пов'язаним із, Activityі цей метод викликається пізніше, коли його Viewвже не існує, тому шукаю будь-який з моїх TextViewрезультатів в a NullPointerException.
Крім того, я виявив, що зберігати посилання на моє TextViewsне є хорошою ідеєю для Fragments, навіть якщо це було нормально з Activity's. У цьому випадку onSaveInstanceState()фактично зберігається стан, але проблема з’являється знову, якщо я повернути екран двічі, коли фрагмент буде приховано, оскільки його onCreateView()не буде викликано в новому екземплярі.
Я думав про збереження стану в onDestroyView()в який - то Bundle-типу елемент члена класу (це на самому справі більше даних, а не тільки один TextView) і економії , що в onSaveInstanceState()але є й інші недоліки. В першу чергу, якщо фрагмент в даний час показано, порядок виклику двох функцій відновлюється, так що я повинен був би рахунок для двох різних ситуацій. Має бути більш чисте і правильне рішення!