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