У меня есть пользовательский интерфейс, где мне нужно отобразить (с видом) Fragment
в альбомном режиме, но не в портретном режиме. В портретном режиме он все равно будет доступен, но вместо этого отобразит его результат, используя вместо этого ListPopupWindow
.Фрагмент без просмотра сбоев при изменении конфигурации
Я понял, что смогу справиться с этим, используя тег <fragment />
для ландшафтного макета, создавая фрагмент программно, если он не был запущен (в случае, когда мы находимся на портрете).
Это прекрасно работает до тех пор, как вы начинаете в пейзаже, если вы начинаете в портретном, где создаются фрагмент программно приложение будет сбоить при повороте эмулятора, когда он пытается присоединить фрагмент к макету:
java.lang.IllegalStateException: Фрагмент не создал вид. на android.app.Activity.onCreateView (Activity.java:4095)
Документах для Fragment.isInLayout()
, кажется, намекают, что он должен быть в состоянии справиться с ней таким образом:
возвращающие если макет включен как часть иерархии видов деятельности через тег. Это всегда верно, когда фрагменты создается с помощью тега, за исключением случая, когда старый фрагмент восстанавливается из предыдущего состояния и не появляется в расположении текущего состояния.
Итак, вопрос в том, как это сделать правильно или если что-то мне не хватает?
UPDATE:
Похоже isInLayout()
не ведет себя, как он должен в настоящее время, а также. Он возвращает false, если вы добавили Fragment
в контейнер вручную.
Кроме того, если добавить Fragment
вручную в контейнер, а затем повернуть (устройство) в макет, который не содержит, что макет будет врезаться:
Вызванный: java.lang.IllegalArgumentException : нет вид не найдено для идентификатора 0x7f060011 для фрагмента SearchFragment {4042f868 # 2 ID = 0x7f060011 SearchFragment} на android.app.FragmentManagerImpl.moveToState (FragmentManager.java:722)
Я думаю, что некоторые странности происходят с фрагментами и изменениями конфигурации. Я подал сообщение об ошибке, что-то вроде этого: http://code.google.com/p/android/issues/detail?id=14796. Порядок обратных вызовов фрагмента не так документирован, когда приложение проходит через ротацию устройства. –
У меня была эта проблема довольно давно. Я не знаю, применима ли она к вам, но в моем случае добавление 'if (container == null) возвращает null;' в начале метода 'onCreateView()' block предотвращает создание представления, которое предотвращает загрузку «Фрагмента», если это не требуется при изменении ориентации. –
@espi, Я пробовал это, но мой фрагмент все еще падает, так как трассировка стека даже не попадает ни в один из моих кодов. У меня есть подозрение, что это имеет какое-то отношение к моей настройке setRetainInstance. Вы это установили? – nmr