Как работает автоматическое восстановление фрагментов
При использовании 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
? Поскольку из-за разных макетов ориентации с разным количеством фрагментов мое первоначальное намерение состояло в том, чтобы воссоздать только один фрагмент состояния, отмеченный как сохраненный, не восстанавливать другие фрагменты представления, которые не отмечены как сохраненные.
Ответы
Ответ 1
Просмотр иерархии в автоматическом восстановлении. Итак, в Fragment.onCreateView()
или Activity.onCreate()
вам нужно восстановить все виды (из xml или программно). Каждый ViewGroup
, содержащий фрагмент, должен иметь тот же идентификатор, что и при его создании в первый раз. После создания иерархии представлений, Android восстанавливает все фрагменты и помещает их в правильное ViewGroup
в соответствии с идентификатором. Скажем, что Android запоминает идентификатор ViewGroup
, на котором был фрагмент.
Это происходит где-то между onCreateView()
и onStart()
.
Я думаю, что можно было бы сохранить фрагмент отдыха, но, в ViewGroup, который удерживает фрагмент, установите видимость на GONE. Таким образом, фрагмент не появляется, и вы можете удалить его программно позже.