Обмен фрагментами в одной активности?

На планшете у нас есть два фрагмента (два разных вида одних и тех же данных), которые расположены рядом друг с другом. На мобильных устройствах мы хотели бы переключаться между этими двумя фрагментами одним нажатием кнопки. Мобильный макет выглядит примерно так:

<RelativeLayout> <fragment id="container" name="fragA"/> <ImageButton onClick="swapFragments" /> </RelativeLayout> 

В swapFragments(View) активности я пытаюсь использовать FragmentManager для замены fragA на fragB :

 FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); fragmentTransaction.replace(R.id.container, new FragB()); fragmentTransaction.commit(); 

… но я всегда могу видеть fragA через прозрачные части fragB , заставляя меня поверить, что он просто кладет fragB поверх fragA , а не заменяет его.

Я начинаю идти по пути использования hide(Fragment) и подобных методов в транзакции, но это не похоже на правильный способ сделать это.

Любые советы о том, как правильно заменить эти фрагменты?

Редактировать : я видел ответ на этот вопрос . Это меня смущает, хотя мне нужно указать другой планшет для планшета и телефона. Если мне нужно программно добавить фрагменты, как мне избежать кода, специфичного для каждого макета в активности (т. Е.

  if(TABLET) { addFragmentA(); addFragmentB(); } else { addFragmentA(); } 

Не смешивайте Фрагменты, созданные в XML и в коде, – будут происходить плохие вещи. Сохраните представление контейнера в макете, затем добавьте / замените фрагменты в нем (в нем нет первого фрагмента).

Похоже на меня, я делаю что-то подобное, хотя я добавляю свой первоначальный фрагмент из активности, используя add а не загружая его, ссылаясь на него в макете. Там может быть ошибка. FYI Я использую библиотеку совместимости.

Возможно, стоит попробовать:

1) Добавьте транзакцию в задний стек, чтобы убедиться, что это имеет значение, похоже, что вы, возможно, захотите эту функциональность.

2) Дайте вашему фрагменту в макете идентификатор или тег, а затем используйте его для выполнения remove и add fragB.

3) Попробуйте загрузить ваш fragA из кода и посмотрите, не изменилось ли это.

Ну, прежде всего, вы можете попробовать использовать фабричный метод newInstance () для создания экземпляра фрагмента B, а не только нового FragB (). Однако, я думаю, это не проблема.

Можете ли вы просто попробовать не использовать в себе XML-макет тега фрагмента? Просто сделайте что-нибудь вроде этого:

 <RelativeLayout> <Linear/FrameLayout id="container" name="fragA"/> <ImageButton onClick="swapFragments" /> </RelativeLayout> 

Поэтому используйте как Frame или LinearLayout в качестве контейнера для фрагмента и раздуйте его в обратном вызове onCreateView из фрагмента. Может быть, это помогает, дайте мне знать.

Ура!

Насколько я вижу, вы не скрываете / отсоединяете предыдущий фрагмент, чтобы оба отображались. Вы можете реализовать что-то вроде этого:

  if (mFragment != null) { ft = mActivity.getSupportFragmentManager().beginTransaction(); ft.hide(mFragment); ft.detach(mFragment); ft.commitAllowingStateLoss(); } 
Intereting Posts
Закрывается ли база данных, открытая с помощью window.openDatabase? Файлы расширения Apk – Лицензирование приложений – Учетная запись разработчика – NOT_LICENSED ответ RecyclerView не отображается TextToSpeech.setEngineByPackageName () ничего не устанавливает Eclipse не запускает приложение для Android на эмуляторе во второй раз Использование GoogleApiClient из Push Notification IntentService для отправки данных на Android Wear OpenGL 2.0 или выше с расширением FBO – LibGDX Error Отправлять широковещательный UDP, но не получать его на других устройствах Android От разработки веб-приложений до Android Выполнять поиск по Android в рамках одной активности Храните элемент с высоким списком с помощью SimpleCursorAdapter Диалоговое окно «Прогресс» появляется странно на устройствах с предварительным лечением Что такое стратегия Android, когда батарея устройства низка? Найти макет с координатой x, y Установка Android studio 1.1.0 minifyEnabled true вызывает проблемы с приложением