Ist dies der richtige Weg, um Fragment-Back-Stapel aufzuräumen, wenn Sie einen tief verschachtelten Stapel verlassen?

StackOverflow https://stackoverflow.com/questions/5802141

Frage

Ich verwende die Android -Kompatibilitätsbibliothek, um Fragmente zu implementieren, und habe die Layout -Probe so erweitert, dass ein Fragment eine Taste enthält, die ein anderes Fragment abfeuert.

Im Auswahlbereich links habe ich 5 ausgewählbare Elemente - - A B C D E.

Jeder lädt ein Fragment auf (über " FragmentTransaction:replace) im Detailsbereich - a b c d e

Jetzt habe ich das Fragment erweitert e einen Knopf enthalten, der ein anderes Fragment lädt e1 Auch im Detailbereich. Ich habe das auf Fragment gemacht eDie Onclick -Methode wie folgt:

FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.replace(R.id.details_frag, newFrag);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.addToBackStack(null);
ft.commit();

Wenn ich die folgende Auswahl mache:

E - e - e1 - D - E

Dann Fragment e ist im Detailbereich. Das ist in Ordnung und was ich will. Wenn ich jedoch auf den Treffer schlage back Button an diesem Punkt tut es nichts. Ich muss zweimal klicken, weil e1 ist immer noch auf dem Stapel. Nachdem ich nach dem Klicken in der Lage bin, habe ich eine Nullzeiger -Ausnahme in OnCreateView erhalten:

Um dieses Problem zu lösen, fügte ich das Folgende hinzu, wann immer A B C D E ist ausgewählt:

FragmentManager fm = getActivity().getSupportFragmentManager();
for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {
    fm.popBackStack();
}

Sie fragen sich nur, ob dies die richtige Lösung ist oder ob ich etwas anderes tun sollte?

War es hilfreich?

Lösung

Nun, es gibt ein paar Möglichkeiten, dies abhängig vom beabsichtigten Verhalten zu tun, aber dieser Link sollte Ihnen die besten Lösungen geben und nicht überraschend von Dianne Hackborn stammt

http://groups.google.com/group/android-developers/browse_thread/thread/d2a5c203dad6ec42

Im Wesentlichen haben Sie die folgenden Optionen

  • Verwenden Sie einen Namen für Ihren anfänglichen Back Stack -Status und verwenden SieFragmentManager.popBackStack(String name, FragmentManager.POP_BACK_STACK_INCLUSIVE).
  • Verwenden FragmentManager.getBackStackEntryCount()/getBackStackEntryAt().getId()Um die ID des ersten Eintrags auf dem hinteren Stapel abzurufen, undFragmentManager.popBackStack(int id, FragmentManager.POP_BACK_STACK_INCLUSIVE).
  • FragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)soll den gesamten Back -Stapel knallen ... Ich denke, die Dokumentation dafür ist einfach falsch. (Eigentlich denke ich, dass es einfach nicht den Fall abdeckt, an dem Sie vorbeikommen POP_BACK_STACK_INCLUSIVE),

Andere Tipps

Die andere saubere Lösung, wenn Sie nicht alle Stapeleinträge platzen lassen möchten ...

getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
getSupportFragmentManager().beginTransaction().replace(R.id.home_activity_container, fragmentInstance).addToBackStack(null).commit();

Dadurch wird der Stapel zuerst gereinigt und dann ein neues Fragment geladen. Zu einem bestimmten Zeitpunkt haben Sie also nur ein einzelnes Fragment im Stack

Dank an Joachim Antwort, ich benutze den Code, um endlich alle Back Stack -Eintrag zu löschen.

// In your FragmentActivity use getSupprotFragmentManager() to get the FragmentManager.

// Clear all back stack.
int backStackCount = getSupportFragmentManager().getBackStackEntryCount();
for (int i = 0; i < backStackCount; i++) {

    // Get the back stack fragment id.
    int backStackId = getSupportFragmentManager().getBackStackEntryAt(i).getId();

    fm.popBackStack(backStackId, FragmentManager.POP_BACK_STACK_INCLUSIVE);

} /* end of for */

Ich habe viel für die Reinigung von Backstack recherchiert und endlich sehen Transaktions -Backstack und sein Management. Hier ist die Lösung, die für mich am besten funktioniert hat.

 // CLEAR BACK STACK.
    private void clearBackStack() {
        final FragmentManager fragmentManager = getSupportFragmentManager();
        while (fragmentManager.getBackStackEntryCount() != 0) {
            fragmentManager.popBackStackImmediate();
        }
    }

Die obige Methode schaltet alle Transaktionen im Backstack ab und entfernt sie sofort nacheinander.

Notiz: oberen Code funktioniert irgendwann nicht und ich kann mich stellen Anr Aufgrund dieses Codes versuchen Sie dies bitte nicht.

AktualisierenUnten Methode entfernen Sie die gesamte Fregment dieses "Namens" von Backstack.

FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.popBackStack("name",FragmentManager.POP_BACK_STACK_INCLUSIVE);
  • Name If Nicht-Null, dies ist der Name eines früheren Back-Status, nach dem man suchen muss. Wenn es gefunden wird, werden alle Staaten bis zu diesem Staat geknallt. Das
  • POP_BACK_STACK_INCLUSIVE -Flag kann verwendet werden, um zu steuern, ob der benannte Status selbst geplagt ist. Wenn NULL, wird nur der oberste Zustand geknallt.

Ich benutze einen ähnlichen Code wie die, die die While -Schleife verwenden, aber ich nenne die Eintragsanzahl in jeder Schleife ... also ist es etwas langsamer

FragmentManager manager = getFragmentManager();
while (manager.getBackStackEntryCount() > 0){
        manager.popBackStackImmediate();
    }
    // pop back stack all the way
    final FragmentManager fm = getSherlockActivity().getSupportFragmentManager();
    int entryCount = fm.getBackStackEntryCount(); 
    while (entryCount-- > 0) {
        fm.popBackStack();
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top