Подтвердить что ты не робот

Как работает автоматическое восстановление фрагментов

При использовании FragmentActivity он автоматически восстанавливает состояние фрагмента и воссоздает все фрагменты.

Я знаю, что это делается в основном с сохранением состояния в onSaveInstanceState, а затем восстановлено в действии onCreate. Немного о коде, который я видел, что все фрагменты воссозданы (или только прикреплены, если preserveInstance истинно) и добавлены в FragmentManager, но мне не ясно, каким образом они добавляются в представление, потому что view isn Автоматически восстанавливается.

Мои первоначальные проблемы заключались в том, что я получаю дубликаты некоторых фрагментов, похожих на на другой вопрос. Я работал в onCreate с помощью

   Fragment f = fm.findFragmentByTag(tagName);
   if(f==null) {
       f = createFragment();
       fm.beginTransaction().add(R.id.myContainer,f,tagName).commit();
   }  else {
     //Nothing it on the view
   }

Теперь он работает, но я до сих пор не понимаю, как это работает.

Мои сомнения:

  • В какой момент и как фрагменты привязаны к представлению? Я экспериментировал, что восстановление фрагмента выполняется в onCreate FragmentActivity. Но если после этого я назовём setContentView, как фрагмент присоединяется к представлению?
  • Можно ли предотвратить восстановление фрагментов без перезаписывания onSaveInstanceState? Поскольку из-за разных макетов ориентации с разным количеством фрагментов мое первоначальное намерение состояло в том, чтобы воссоздать только один фрагмент состояния, отмеченный как сохраненный, не восстанавливать другие фрагменты представления, которые не отмечены как сохраненные.
4b9b3361

Ответ 1

Просмотр иерархии в автоматическом восстановлении. Итак, в Fragment.onCreateView() или Activity.onCreate() вам нужно восстановить все виды (из xml или программно). Каждый ViewGroup, содержащий фрагмент, должен иметь тот же идентификатор, что и при его создании в первый раз. После создания иерархии представлений, Android восстанавливает все фрагменты и помещает их в правильное ViewGroup в соответствии с идентификатором. Скажем, что Android запоминает идентификатор ViewGroup, на котором был фрагмент. Это происходит где-то между onCreateView() и onStart().

Я думаю, что можно было бы сохранить фрагмент отдыха, но, в ViewGroup, который удерживает фрагмент, установите видимость на GONE. Таким образом, фрагмент не появляется, и вы можете удалить его программно позже.