2016-10-23 1 views
2

Обновление Хорошо, я понял, что такое пролем. Я пытаюсь найти фрагмент по тегу, но когда я добавляю его в адаптер, я не могу установить тег для фрагмента. Но я не знаю, как добавить.Переместить фрагмент из представления пейджера в другой контейнер

Я использую пейзаж и портрет в своем приложении. Ландшафтная компоновка содержит два макета, расположенных в противоположном направлении, портретная макет содержит страницу просмотра с пейджером состояния фрагмента. У меня есть фрагмент с видом ресайклера и еще один фрагмент с круговой диаграммой. Когда я поворачиваю телефон от земли к портрету, я получаю контейнер Exception, Fragment имеет другой идентификатор, поэтому я удаляю фрагмент из менеджера фрагментов, прежде чем добавлять его снова. Он решает исключение, но в этом случае я не могу сохранить состояние просмотра. Как я могу

+0

государственными средствами, положение прокрутки? или вы не хотите загружать все данные утилизации? – Farhan

+0

Пробовал ли я, что я упомянул в своем ответе? setRetainInstance? – Farhan

+0

Я пробовал, но в этом случае я получаю это исключение: java.lang.RuntimeException: не удается запустить активность ComponentInfo {hu.astron.rectruiting/hu.astron.rectruiting.MainActivity}: java.lang.IllegalArgumentException: нет представления найденный для id 0x7f0b005a (hu.astron.rectruiting: id/pager) для фрагмента PersonFragment {f9530d7 # 0 id = 0x7f0b005a} – user3057944

ответ

0

Наконец-то я понял, в чем проблема. Прежде чем добавить фрагменты в пейджер, я должен установить тег с помощью add (фрагмент, тег). Это была ошибка, я не установил тег для фрагментов, поэтому, когда я попытался найти фрагмент по тегу, он был нулевым, и я всегда создал новый экземпляр.

0

Хорошо, если вы хотите остановить свое приложение от воссоздания при изменении ориентации. Добавьте эту строку android:configChanges="orientation|screenSize" к вашей деятельности в вашем файле AndroidManifest.xml. Эта строка останавливает приложение, которое воссоздается при изменении ориентации, просто ничего не меняет ориентацию.

Пример

<activity android:name=".MainActivity" 
    android:configChanges="orientation|screenSize" > 
    <intent-filter> 
     <action android:name="android.intent.action.MAIN" /> 
     <category android:name="android.intent.category.LAUNCHER" /> 
    </intent-filter> 
</activity> 
+0

без повторного воссоздания, как он может использовать разные макеты для пейзажа и портрета? – Farhan

+0

Спасибо, моя проблема не в том, чтобы сохранить состояние фрагмента. Моя проблема: я не могу добавить свой фрагмент в контейнер, после того как я добавил его в FragmentStatePagerAdapter без вызова fragmentManager.remove(). Однако вы можете справиться с изменением ориентации, переопределив метод onConfigurationChanged() – user3057944

+0

@Farhan, да, плохо, не считал это. – FARID

0

Я не знаю точно, но эта функция говорит, он сохранит состояние фрагмента. Вы можете попробовать это:

setRetainInstance 

От Android Docs

Он не будет разрушать и воссоздать только фрагмент.

+0

Спасибо, но моя проблема не совсем с сохранением состояния фрагмента, я не могу добавить его в контейнер после того, как я добавил его в пейджер. – user3057944

+0

Да, тот же фрагмент не может быть помещен в два вида. насколько мне известно – Farhan

0

Я хотел бы сохранить положение прокрутки. Приложение запускается в портретной ориентации, поэтому я добавляю фрагменты в FragmentStatePager, , чем я переключаюсь на пейзаж, я вызываю фрагментатор manManager.replace (фрагмент, contraintContainer, tag), , и если я вернусь к портрету, удалить его менеджер фрагментов Я получаю это исключение: java.lang.IllegalStateException: Невозможно изменить идентификатор контейнера фрагмента PersonFragment {9726278 # 2 id = 0x7f0b005b persons}: было 2131427419 сейчас 2131427418 , но если я вызову фрагментManager.remove() I не может сохранять положение прокрутки.