2013-03-23 5 views
19

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

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

Мои первоначальные проблемы заключались в том, что я получаю дубликаты некоторых фрагментов, подобных that other question. я workarrounded что в onCreate с:

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

Сейчас он работает, но я до сих пор совершенно не понимаю, как это работает.

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

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

ответ

7

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

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