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