Я нашел много случаев аналогичного вопроса по 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
это работает только в очень специфических ситуациях. В частности, ужасно ломается замена фрагмента, помещение его в задний стек, а затем вращение экрана, пока отображается новый фрагмент. Из того, что я понял, старый фрагмент не получает вызов onSaveInstanceState()
при замене, но остается каким-то образом связанным с Activity
, и этот метод вызывается позже, когда его View
больше не существует, поэтому ищем любой из мой TextView
приводит к NullPointerException
.
Кроме того, я обнаружил, что сохранение ссылки на мой TextViews
не очень хорошая идея с Fragment
, даже если это было в порядке с Activity
. В этом случае onSaveInstanceState()
фактически сохраняет состояние, но проблема появляется снова, если я дважды поворачиваю экран, когда фрагмент скрыт, поскольку его onCreateView()
не вызывают в новом экземпляре.
Я думал о сохранении состояния в onDestroyView()
в некотором элементе класса Bundle
-type (на самом деле это больше данных, а не только один TextView
) и сохранении этого в onSaveInstanceState()
, но есть и другие недостатки. Прежде всего, если фрагмент отображается в данный момент, порядок вызова двух функций меняется на противоположный, поэтому мне нужно учитывать две разные ситуации. Должно быть более чистое и правильное решение!