2012-11-10 6 views
9

Meine Anforderung ist ziemlich einfach: Ich habe eine Schaltfläche, die ein FragmentA durch FragmentB ersetzen sollte.FragmentTransaction.remove hat keine Wirkung

Das klingt einfach und fast funktioniert, das große Problem ist, dass das alte Fragment nicht entfernt wird und das neue auf der Vorderseite des alten platziert und sie "leben" zusammen in meinem Layout.

enter image description here

Der Code:

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

Das Layout:

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

    <fragment 
     android:id="@+id/fragmentitself" 
     android:name="com.WazaBe.MyApp.FragmentA" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
</FrameLayout> 

Antwort

14

Lösung

Zuerst müssen Sie Ihr Fragment aus XML entfernen und leeren Behälter halten es:

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

Dann müssen Sie Ihr com.WazaBe.MyApp.FragmentA Fragment von Code hinzufügen, das heißt in onCreate() Ihrer Mutter Aktivität.

Erklärung

Es ist, weil mit Transaktionen, die Sie ViewGroup manipulieren wie FrameLayouts, die Behälter für Fragmente ist. Aber wenn Sie Ihr Fragment direkt im XML-Layout platzieren, wird es permanent Teil der View-Hierarchie und da es dauerhaft ist, kann es nicht aus dem Code entfernt werden.

Sobald Sie Ihr Layout repariert, die remove() Anruf nicht mehr benötigt wird - es ist nur ausreichen, um replace()

+0

Arbeiten! Vielen Dank. –

5

tun Wenn Sie ein Fragment in einem View-Container (wie ein Framelayout) platzieren möchten, müssen Sie Vergewissern Sie sich, dass Ihr Container leer ist (Sie können nur ein Fragment hineinlegen). Sie können ein in der XML-Datei geschriebenes Fragment nicht ersetzen, Sie sollten A durch JAVA-Code in den Container einfügen, und wenn Sie keine ID eingeben kann es durch B ersetzen;

zunächst Ihr Behälter ist empyt:

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

OK, setzen Sie fragmenta hinein:

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

NOW, wenn Sie ersetzen möchten:

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(); 
+0

Sorry, der andere Typ war schneller, vielen Dank für die Antwort. –