2012-03-28 7 views
7

Ich habe ein Layout für den Querformat-Modus, das links ein ListView und rechts ein FrameLayout zeigt. Wenn ein Element aus der Liste ausgewählt wird, wird ein weiteres Fragment mit dem FrameLayoutKann ein Fragment nicht aus FrameLayout entfernen?

MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.myFrameLayout); 
FragmentTransaction ft = fragmentManager.beginTransaction(); 
if (myFragment == null) { 
    myFragment = new MyFragment(uri); 
    ft.replace(R.id.myFrameLayout, playerFragment); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.commitAllowingStateLoss(); 
} 

Später hinzugefügt ich in der Listenansicht drücken löschen und das letzte Element in der Liste entfernen, und ich versuche, das Fragment zu entfernen, so dass nichts wird gezeigt, aber es funktioniert nicht, mein Fragment bleibt auf dem Bildschirm. Der Code zum Entfernen lautet:

MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.myFrameLayout); 
FragmentTransaction ft = fragmentManager.beginTransaction(); 
ft.remove(myFragment); 
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
ft.commitAllowingStateLoss(); 

Irgendwelche Ideen, warum es nicht aus der Ansicht entfernt wird?

+3

Ich habe genau das gleiche Problem. Wurde eine Lösung gefunden? – Jared

Antwort

3

Deklarieren Sie das Fragment in XML? Unter Berufung auf Dianne Hackborn von Google:

definieren Fragmente in XML ist vor allem für Dinge gedacht, die sich um bleiben werden. Wenn Sie hinzufügen und entfernen möchten, sollten Sie dies wahrscheinlich immer dynamisch tun.

hoffen, dass es

+0

Ich denke, er bezieht sich auf die Verwendung des Tags im XML-Layout. Ich benutze das nicht, ich verwende ein FrameLayout als Platzhalter und aktualisiere dynamisch das Fragment, das darin eingefügt wird. Ich könnte versuchen, die FragmentTransaction.hide() -Methode zu verwenden, die in dem Thread erwähnt wurde, auf den Sie verwiesen haben. – DaveJohnston

+0

Nun, diese API ist einfach schlecht. Sie führen einen einfachen 'remove()' Aufruf aus, und die grundlegende Aufgabe, die Sie erwartet haben, funktioniert nicht. – milosmns

+0

Es funktioniert für Fragmente, die mit einer expliziten Transaktion hinzugefügt wurden, die von Ihnen programmgesteuert erstellt wurde. – Blackbelt

0

hilft, wenn Sie Ihr Fragment von Id zu finden, bekommt man Referenzbehälter zu Fragmente selbst nicht fragmentieren. ein Tag verwenden, wenn Sie Fragment addiing und dann durch die TAG zu finden:

MyFragment myFragment = (MyFragment) fragmentManager.findFragmentByTag("yourTag"); 
11

@DaveJohnston Ich habe den Code für entfernen Fragment habe ich versucht, einfach geformt .... danke :)

Hey ich das nicht wissen, ist Lösung für Ihr Problem oder nicht, aber Sie versuchen, diese Art und Weise wird es funktionieren:

Ansatz Fragment hinzuzufügen:

YourFragment yourFrament; 

//Add your Fragment 
public void addYourFragment(){ 
yourFragment = new YourFragment(); 

FragmentTransaction transation = getSupportFragmentManager().beginTransaction(); 
transation.replace(R.id.yourFlowLayout, yourFragment); 

     transation.commit(); 

} 

Ansatz Fragment zu entfernen:

//Remove Fragment 
    public void removeYourFragment(){ 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
      if (yourFragment != null) {   
       transaction.remove(yourFragment); 
       transaction.commit(); 
       transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
       yourFragment = null; 
      } 
    } 
+0

Was passiert, wenn ich transaction.remove (null) schreibe? Wird es das oberste Fragment im Stapel entfernen? oder was wird passieren? –

0

ich eine sehr harte Zeit hatte zu diesem Thema eine SO Referenz zu finden, die auftreten, wenn nicht <fragment> über XML Einstellung, aber in der Tat jede Fragment dynamisch mit FragmentTransaction und <FrameLayout> Einstellung.

Die Lösung von Gru zu vereinfachen, was es für mich gelöst hat, war einfach .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE) zu meiner Ersetzungs-Transaktion hinzuzufügen, und es hat funktioniert! Frühere Fragmente sind jetzt tatsächlich nicht sichtbar.

Ich denke, andere Übergänge würden auch funktionieren.

0
private static String TAG_FRAGMENT="MyFragment"; 
MyFragment myFragment = (MyFragment) fragmentManager.findFragmentById(R.id.myFrameLayout); 
FragmentTransaction ft = fragmentManager.beginTransaction(); 
if (myFragment == null) { 
     myFragment = new MyFragment(uri); 
    ft.replace(R.id.myFrameLayout, playerFragment,TAG_FRAGMENT); 
    ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN); 
    ft.addToBackStack(TAG_FRAGMENT); 
    ft.commit(); 
} 

wenn Ihr Fragment ersetzt ft.addToBackStack(null) Methode zu verwenden, nach dem Fragmente leicht zu entfernen.

Fragment fragment = getSupportFragmentManager().findFragmentByTag(TAG_FRAGMENT); 

if(fragment != null) 
getSupportFragmentManager().beginTransaction().remove(fragment).commit(); 
0

Wenn Sie eine Fragment haben, die auf Ersatz des Fragment im FrameLayout nicht entfernt wird? Sie können es entfernen, indem Sie vor dem Aufruf des regulären Ersetzungs-Commits einen separaten Entfernungsübergang mit FragmentTransaction.TRANSIT_FRAGMENT_CLOSE darauf festschreiben.

Fragment removeThisFragment;//Keep a reference to the fragment you want to remove 
... 
FragmentManager fragmentManager = getSupportFragmentManager(); 
FragmentTransaction transaction = fragmentManager.beginTransaction(); 

// This fragment "sometimes" do not get replaced so we remove it here if it's added. 
     if(removeThisFragment!=null&&removeThisFragment.isAdded()) { 
      transaction = fragmentManager.beginTransaction(); 
      transaction.remove(removeThisFragment); 
      transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE); 
      transaction.commitAllowingStateLoss(); 
     } 

     // update the main content by replacing fragments 
     transaction = fragmentManager.beginTransaction(); 
     transaction.replace(R.id.content_frame, fragment, TAG_MAIN_FRAGMENT).commit(); 

Aber ich schlage vor, zunächst zu versuchen, herauszufinden, warum das Fragment nicht an erster Stelle ersetzt wird, zu überprüfen, ob es einige schwere Arbeit tut oder etwas, das es von zu halten ersetzt bekommen ?? Aber wenn Sie eine schnelle temporäre Lösung benötigen, probieren Sie den obigen Code.