Как работает "onViewStateRestored"из фрагментов?

Я действительно путаю с внутренним состоянием фрагмента. У меня есть действие, содержащее только один фрагмент сразу и заменяет его, если другой фрагмент должен быть показан. Из документов onSaveInstanceState называется только если Activitys onSaveInstanceState вызывается (который не вызывается в моем случае).

если я остановлю свой фрагмент, я сам сохраню его состояние внутри Синглета (да, я знаю, что тоже ненавижу Синглеты, но это не моя идея). Поэтому я должен воссоздать целое ViewHirarchy, создать новые представления (используя ключевое слово new), восстановить его состояние и вернуть их в onCreateView. У меня также есть флажок внутри этого представления, из которого я явно делаю не хотите сохранить свое состояние.

на FragmentManager хочет быть "умным" и называет onViewStateRestored с расслоением я никогда не создавал себя и "восстанавливает" состояние старого CheckBox и применяет его к моему новому флажку. Это вызывает так много вопросов:

Я могу контролировать сверток из onViewStateRestored?

как FragmentManager принимает состояние (возможно, собранного мусора) флажка и применяет его к новому?

почему он сохраняет только состояние флажка (а не TextViews??)

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

обратите внимание, я использую Fragmentv4, поэтому никакого API > 17, необходимые для onViewStateRestored

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's restore process
F.onCreateView(); //f's view will be recreated
F.onViewStateRestored(); //load your info and restore the state of f's 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");
        }
    }

}