Поменять местами фрагменты в одном действии? - PullRequest
6 голосов
/ 15 июня 2011

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

<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();
 }

Ответы [ 4 ]

3 голосов
/ 07 августа 2013

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

0 голосов
/ 01 февраля 2013

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

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

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

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

Ура!

0 голосов
/ 06 июля 2013

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

        if (mFragment != null) { 
            ft = mActivity.getSupportFragmentManager().beginTransaction();  
            ft.hide(mFragment);                 
            ft.detach(mFragment);
            ft.commitAllowingStateLoss();
        }
0 голосов
/ 16 июня 2011

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

Может стоит попробовать:

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...