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