Как работает "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");
}
}
}