Ist das der richtige Weg, um den Stack Stack zu bereinigen, wenn man einen tief verschachtelten Stack hinterlässt?
Ich bin mit der Android Compatibility library zu implementieren, Fragmente und erweitert die layout-Beispiel so, dass ein fragment enthält eine Schaltfläche, die feuert aus einem anderen fragment.
In der Auswahl auf der linken Seite habe ich 5 wählbare Positionen - A B C D E
.
Jeder lädt sich ein fragment (über FragmentTransaction:replace
) im Detailbereich - a b c d e
Nun habe ich die erweiterte fragment e
enthalten eine Schaltfläche, die Lasten bis einem anderen fragment e1
auch im Detailbereich. Ich habe dies auf fragment e
's 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 treffen Sie die folgende Auswahl:
E - e - e1 - D - E
Dann fragment e
ist im Detailbereich. Das ist fein und was ich will. Allerdings, wenn ich auf den back
- Taste an dieser Stelle tut es nichts. Ich klicke es doppelt, weil e1
immer noch auf dem Stapel. Außerdem wird nach klicken auf rund bekam ich einen null-Zeiger-Ausnahme in onCreateView:
Zu 'lösen' dieses problem ich habe Folgendes, wenn A B C D E
ausgewählt ist:
FragmentManager fm = getActivity().getSupportFragmentManager();
for(int i = 0; i < fm.getBackStackEntryCount(); ++i) {
fm.popBackStack();
}
Nur die Frage, ob das die richtige Lösung ist oder ob ich sollte, etwas anderes zu tun?
InformationsquelleAutor der Frage PJL | 2011-04-27
Du musst angemeldet sein, um einen Kommentar abzugeben.
Gut es gibt ein paar Möglichkeiten, darüber zu gehen, dies in Abhängigkeit von der beabsichtigten Verhalten, aber dieser link sollte Ihnen allen die besten Lösungen und nicht überraschend ist, von Dianne Hackborn
http://groups.google.com/group/android-developers/browse_thread/thread/d2a5c203dad6ec42
Im wesentlichen haben Sie folgende Möglichkeiten
FragmentManager.popBackStack(String name,
.FragmentManager.POP_BACK_STACK_INCLUSIVE)
FragmentManager.getBackStackEntryCount()
/getBackStackEntryAt().getId()
zum abrufen der ID des ersten Eintrags auf der Rückseite-stack, und
FragmentManager.popBackStack(int id,
.FragmentManager.POP_BACK_STACK_INCLUSIVE)
FragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE)
soll pop den gesamten Rücken stapeln... ich denke, die Dokumentation für
das ist einfach falsch. (Eigentlich denke ich es nicht nur für den Fall, wo
Sie übergeben
POP_BACK_STACK_INCLUSIVE
),InformationsquelleAutor der Antwort Joachim
Andere saubere Lösung, wenn Sie nicht wollen, um pop-alle stack-Einträge...
Dies wird reinigen Sie den Stapel-erste und laden Sie dann eine neue fragment, so dass zu jedem beliebigen Zeitpunkt haben Sie nur ein einzelnes fragment in der stack -
InformationsquelleAutor der Antwort Pawan M
Dank Joachim Antwort, ich benutze den code, um alle zu löschen zurück-stack Eintrag schließlich.
InformationsquelleAutor der Antwort Jay Parker
Habe ich recherchiert, eine Menge für die Reinigung Backstack, und schließlich sehen Transaktion BackStack und seine Verwaltung. Hier ist die Lösung, die funktionierte für mich am besten.
Der oben beschriebenen Methode Schleifen über alle Transaktionen in den backstack und entfernt Sie sofort ein zu einer Zeit.
Hinweis: obigen code irgendwann nicht arbeiten, und ich Gesicht ANRweil dieser code,also bitte nicht versuchen, diese.
Update
unten-Methode entfernen Sie alle fregment, dass der "name" von backstack.
zu suchen; wenn er gefunden wird, sind alle Zustände bis zu diesem Zustand wird geknallt werden. Die
InformationsquelleAutor der Antwort Lokesh
Bin ich mit einem ähnlichen code wie diesen, verwenden Sie eine while-Schleife, aber ich nenne Sie den Eintrag count in jeder Schleife... also ich nehme an, es ist etwas langsamer
InformationsquelleAutor der Antwort Jorge Lozano
InformationsquelleAutor der Antwort farid_z