2016-02-01 3 views
2

При вращении экрана отображается мой вложенный фрагмент, но в течение нескольких коротких моментов также отображается родительский фрагмент.Показать вложенные фрагменты на экране вращения без отображения родительского фрагмента

У меня есть моя основная функция, которая имеет FrameLayout с ID activity_base_container.

Я делаю это, когда начинается моя деятельность:

Fragment initialFragment = getInitialFragment(); 
mFragmentManager.beginTransaction() 
     .add(R.id.activity_base_container, initialFragment, initialFragment.getClass().getSimpleName()) 
     .commit(); 

Это initialFragment начальный фрагмент отвечает проверить некоторые условия и в зависимости от них будет запущен один из двух возможных фрагментов:

fragmentManager.beginTransaction().replace(R.id.activity_base_container, fragment, fragment.getClass().getSimpleName()).commit(); 

Lets предположим, что он запускает FragmentF (с корнем FrameLayout с идентификатором fragment_f_root). Этот макет фрагментов имеет набор параметров. Когда пользователь нажимает одну из этих опций, соответствующий фрагмент создается и запускается так:

//The example here is an option that displays a google map. 
fragment = FragmentMapMultipleActivity.newInstance(); 
fragmentManager.beginTransaction() 
     .replace(R.id.fragment_f_root, fragment) 
     .addToBackStack(fragment.getClass().getSimpleName()) 
     .commit(); 

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

Возможно ли после поворота экрана показать только вложенный фрагмент, или я должен изменить свою «архитектуру» на что-то еще?

+0

просто мысль: в 'FragmentF' вы должны использовать' getChildFragmentManager() 'вместо« обычного ». Кроме того, убедитесь, что вы _really_ хотите сделать 'addToBackStack' для вложенного фрагмента.Чтобы показать только вложенный фрагмент в ландшафте, я бы создал специальный макет для пейзажа, где 'R.id.fragment_f_root' занимает весь экран (или просто расширяйте его после изменения ориентации). Хотя, я не уверен, что он отвечает на ваш вопрос –

+0

@KonstantinLoginov Спасибо. В 'FragmentF' я использую' getChildFragmentManager() '. Из моего исследования я думаю, что я изменю свою реализацию, поэтому я не использую вложенные фрагменты – Favolas

+0

По моему скромному мнению, я едва могу придумать какие-либо хорошие аргументы, чтобы использовать вложенные фрагменты где-нибудь, кроме «ViewPager». Пользовательские виды уменьшают сложность здесь и обеспечивают более предсказуемый жизненный цикл. –

ответ

1

должен изменить мою «архитектуру» на что-то еще?

Возможно, вы должны.
Самые яркие Android-умы от площади даже выступают, чтобы избежать простых фрагментов везде это возможно: Advocating Against Android Fragments

Вложенные fragemnts, в свою очередь, увеличивает сложность в геометрической прогрессии. Единственный хороший образец их использования, который я видел до сих пор, - ViewPager с его FragmentPagerAdapter. В большинстве других случаев вместо этого использует вместо этого пользовательские виды.
Он сохраняет очищающий жизненный цикл вашего приложения и более предсказуем.

Я не думаю, что вы можете делать с этим мигания вы видите, кроме:

  • setRetainInstance(true) и избежать полного повторного создания фрагмента в деятельности, поэтому держать вас фрагмент данные во время изменения конфигурация (и затем передать тот же фрагмент удерживаемой менеджеру фрагмента)
  • макеты сохраняемости как можно более
  • избежать повторного создания уже инициализированы переменные
  • сохранить onViewCreate() как можно более

Удачи вам!

Смежные вопросы