FragmentTransaction.remove не имеет никакого эффекта

Мое требование довольно простое: у меня есть кнопка, которая должна заменить FragmentA на FragmentB.

Это звучит легко и почти работает, большая проблема в том, что старый фрагмент не удаляется, а новый помещается на передней части старого, и они "живой» вместе в моем макете.

Код:

FragmentManager fragMgr = a.getSupportFragmentManager();
Fragment currentFragment = (Fragment) fragMgr.findFragmentById(R.id.fragmentitself);

if(currentFragment!=null){

     FragmentTransaction fragTrans = fragMgr.beginTransaction();
     fragTrans.remove(currentFragment);

     FragmentB newFragment = new FragmentB();
     fragTrans.replace(R.id.fragmentcontainer, newFragment);
     // I have also tried with R.id.fragmentitself
     fragTrans.addToBackStack(null);
     fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
     fragTrans.commit();
}

Расположение:



    

Ответы на вопрос(3)

он требует выбора одного FragmentABC по умолчанию, представление FragmentABC по умолчанию не может быть удалено, даже если мы используем ft.remove.

Используйте контейнер FrameLayout вместо контейнера Fragment, если вы хотите пустое представление фрагмента при запуске действия.

в Framelayout), вы должны убедиться, что ваш контейнер пуст (только для этого вы можете поместить в него фрагмент). Вы не можете заменить фрагмент, записанный в файле XML, вы следует добавить A в контейнер по коду JAVA, а когда вы неВы можете заменить его на B;

во-первых, ваш контейнер empyt:

<framelayout android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="2" android:id="@+id/fragmentcontainer">
</framelayout>

Хорошо, вы вставили FragmentA в него:

 FragmentTransaction fragTrans = fragMgr.beginTransaction();
 fragTrans.remove(currentFragment);
 FragmentA fragA= new FragmentA();
 fragTrans.add(R.id.fragmentcontainer, fragA).commit();

СЕЙЧАС, если вы хотите заменить:

FragmentTransaction fragTrans = fragMgr.beginTransaction();
 FragmentB newFragment = new FragmentB();
 fragTrans.replace(R.id.fragmentcontainer, newFragment);
 // I have also tried with R.id.fragmentitself
 fragTrans.addToBackStack(null);
 fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
 fragTrans.commit();
 Waza_Be10 нояб. 2012 г., 17:32
Извините, другой парень был быстрее, большое спасибо за ответ.
Решение Вопроса

Решение

Во-первых, вы должны удалить свой фрагмент из XML и просто оставить там пустой контейнер:

<framelayout android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="2" android:id="@+id/fragmentcontainer">
</framelayout>

Затем вам нужно добавить свойcom.WazaBe.MyApp.FragmentA фрагмент из кода, то есть вonCreate() вашей родительской активности.

объяснение

Это потому, что с транзакциями вы манипулируетеViewGroup такие какFrameLayouts это контейнер для фрагментов. Но когда вы помещаете свой фрагмент непосредственно в макет XML, он становитсяпостоянный часть иерархии View, и поскольку она постоянна, ее нельзя удалить из кода.

Как только вы исправите свой макет,remove() звонок больше не нужен - достаточно будет просто сделатьreplace()

 Waza_Be10 нояб. 2012 г., 16:31
За работой! Благодарю.
 achal naskar25 мар. 2019 г., 05:29
@ Marcin Orlowski У меня есть ListView внутри FrameLayout. Как добавить ListView из метода onCreate? Я не могу этого сделать. Плз помогите ...
 Marcin Orlowski25 мая 2019 г., 23:48
Не уверен, что вы спрашиваете на самом деле, но мы говорим здесь фрагменты, а ListView не является фрагментом. Вы можете разместить отдельный вопрос, если вам нужна помощь с вашим кодом.

Ваш ответ на вопрос