Раз и навсегда, как правильно сохранить состояние экземпляра фрагментов в заднем стеке?

Я нашел много случаев аналогичного вопроса по 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с, даже если это было хорошо с 'Activitys. В таком случае,onSaveInstanceState() на самом деле сохраняет состояние, но проблема появляется снова, если я поворачиваю экрандважды когда фрагмент скрыт, так как егоonCreateView() не вызывается в новом экземпляре.

Я думал о сохранении государства вonDestroyView() в некоторыеBundleэлемент-член класса (it 'На самом деле больше данных, а не только одинTextView) и сохранениетот вonSaveInstanceState() но есть и другие недостатки. В первую очередь, если фрагментявляется в настоящее время показано, что порядок вызова этих двух функций обратный, поэтому яМне нужно учитывать две разные ситуации. Должно быть более чистое и правильное решение!

Ответы на вопрос(6)

Ваш ответ на вопрос