Как работает `onViewStateRestored` из Fragments?

Я действительно смущен внутренним состоянием Фрагмента. У меня есть одно действие, удерживающее Фрагмент сразу и заменяющее его, если нужно показать другой фрагмент. Из документов onSaveInstanceState вызывается ТОЛЬКО, если вызываются вызовы Activity onSaveInstanceState (которые не вызываются в моем случае). Если я оставлю свой Фрагмент, я сохраню его состояние в Синглтоне (да, я знаю, что я ненавижу Синглтонов тоже, но не был моей идеей сделать это). Поэтому я воссоздал всю ViewHirarchy, создаю новые представления (используя ключевое слово new), восстановит его состояние и верну их в onCreateView. У меня также есть флажок внутри этого представления, из которого я явно НЕ сохраняю его состояние. Однако FragmentManager хочет быть "умным" вызовом OnViewStateRestored с Bundle, который я никогда не создавал, и "восстанавливает" состояние старого флажка и применяет его к моему НОВОМ флажку. Это вызывает так много вопросов:

Можно ли управлять пакетом из OnViewStateRestored? Как FragmentManager принимает состояние (возможно, garbageCollected) CheckBox и применяет его к новому? Почему это только сохраняет состояние флажка (Not of TextViews?)

Итак, чтобы подвести итог: как работает OnViewStateRestored?

Примечание. Я использую Fragmentv4, поэтому для OnViewStateRestored

не требуется API > 17.

Ответ 1

Ну, иногда фрагменты могут немного запутываться, но через некоторое время вы привыкнете к ним и узнаете, что они все-таки ваши друзья.

Если в методе onCreate() вашего фрагмента вы выполните: setRetainInstance (true); Видимое состояние ваших просмотров будет сохранено, иначе оно не будет.

Предположим, что фрагмент называется "f" класса F, его жизненный цикл будет выглядеть так: - При копировании/прикреплении/показывая это, это методы f, которые вызываются в следующем порядке:

F.newInstance();
F();
F.onCreate();
F.onCreateView();
F.onViewStateRestored;
F.onResume();

В этот момент ваш фрагмент будет виден на экране. Предположим, что устройство повернуто, поэтому информация о фрагменте должна быть сохранена, это поток событий, вызванных вращением:

F.onSaveInstanceState(); //save your info, before the fragment is destroyed, HERE YOU CAN CONTROL THE SAVED BUNDLE, CHECK EXAMPLE BELLOW.
F.onDestroyView(); //destroy any extra allocations your have made
//here starts f restore process
F.onCreateView(); //f view will be recreated
F.onViewStateRestored(); //load your info and restore the state of f view
F.onResume(); //this method is called when your fragment is restoring its focus, sometimes you will need to insert some code here.


//store the information using the correct types, according to your variables.
@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putSerializable("foo", this.foo);
    outState.putBoolean("bar", true);
}

@Override
public void onViewStateRestored(Bundle inState) {
    super.onViewStateRestored(inState);
    if(inState!=null) {
        if (inState.getBoolean("bar", false)) {
            this.foo = (ArrayList<HashMap<String, Double>>) inState.getSerializable("foo");
        }
    }

}