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