У меня есть пользовательский интерфейс, в котором мне нужно, чтобы Fragment
отображался (с видом) в ландшафтном режиме, но не в портретном режиме. В портретном режиме он по-прежнему должен быть доступен, но вместо этого будет отображаться результат с использованием ListPopupWindow
.
Я подумал, что смогу справиться с этим, используя тег <fragment />
для альбомной раскладки при программном создании фрагмента, если он не был запущен (в случае, когда мы находимся в портретной ориентации).
Это отлично работает, пока вы начинаете в альбомной ориентации, если вы начинаете в портретной ориентации, где фрагмент создается программно, ваше приложение падает при повороте эмулятора, когда он пытается прикрепить фрагмент к вашему макету:
java.lang.IllegalStateException: Фрагмент не создал представление. в android.app.Activity.onCreateView(Activity.java:4095)
Документы для Fragment.isInLayout()
, похоже, намекают, что он должен обрабатывать это следующим образом:
Возвратите true, если макет включен как часть иерархии просмотра действий через тег. Это всегда будет верно, когда фрагменты создаются через тег, за исключением случая, когда старый фрагмент восстанавливается из предыдущего состояния и не отображается в макете текущего состояния.
Так вот вопрос, как это сделать правильно или я что-то упускаю?
ОБНОВЛЕНИЕ:
Похоже, что isInLayout()
в настоящее время ведет себя не так, как должен. Он возвращает false, если вы добавили Fragment
в контейнер вручную.
Кроме того, если вы добавите Fragment
вручную в контейнер, а затем повернете (устройство) на макет, который не содержит этот макет, произойдет сбой:
Причина: java.lang.IllegalArgumentException: не найдено представление для идентификатора 0x7f060011 для фрагмента SearchFragment{4042f868 #2 id=0x7f060011 SearchFragment} в android.app.FragmentManagerImpl.moveToState(FragmentManager.java:722)
if (container == null) return null;
в начале метода фрагментаonCreateView()
предотвращает создание представления, что предотвращает загрузкуFragment
, если она не нужна при изменении ориентации. - person Alex Curran   schedule 25.08.2011setRetainInstance
, и там написано, что он не совместим с бэкстеком. Я использовал задний стек, так что это была моя проблема. developer.android.com/reference/android/app/ @hackbod: было бы здорово, если бы вы добавили одно из этих исключений для защиты от идиотов, если бы вы добавили фрагмент в стек с помощьюsetRetainInstance
- person nmr   schedule 26.09.2011