Разочаровавшись в поведении фрагментов, я начал проводить тестирование.
У меня есть одно упражнение и 2 фрагмента. Фрагмент A объявляется в макете xml действия, а фрагмент B добавляется (только если его нет) в макет действия в методе onCreate()
действия. Я добавил логирование всех основных методов жизненного цикла для действия и двух фрагментов и проверил поведение при переключении ориентации назад и вперед. Вот мои выводы:
Фрагмент B (динамически добавленный фрагмент) ведет себя как ожидалось:
a) после изменения ориентации, пакет savedInstanceState
содержит то, что было ранее сохранено в onSaveInstanceState()
b) если setRetainInstance(true)
, то во время изменения ориентации onDestroy()
не вызывается и также не вызывается последующий onCreate()
. Поля фрагмента сохраняются при смене ориентации
Фрагмент A (фрагмент, определенный в макете xml) не работает должным образом:
a) после изменения ориентации, комплект saveInstanceState всегда равен нулю, хотя onSaveInstanceState()
правильно назван
b) если setRetainInstance(true)
, во время изменения ориентации, onDestroy()
не вызывается, как ожидалось, НО, в отличие от ожидаемого, onCreate()
также вызывается, когда фрагмент повторно присоединяется. А также, поля фрагмента не сохраняются.
Подводя итог, для фрагментов, объявленных в макетах xml и использующих ACL v4, сохранение состояния во время изменения ориентации не работает, а setRetainInstance (true) не работает.
У меня вопрос: проверял ли кто-нибудь эту функциональность на Android 3.0+ и мог ли он сказать, правильно ли работают фрагменты при использовании фрагментов из Android SDK.
Одним из способов решения этой проблемы было бы всегда динамически создавать мои фрагменты. Кто-нибудь нашел другой обходной путь?