Entfernen eines Fragments vom hinteren Stapel

70

Ich habe 3 Fragmente in einer Aktivität, wenn eine Tablette im Hochformat gehalten wird. Allerdings habe ich nur 2 dieser Fragmente in der Landschaft. Das Problem, das ich habe, ist, dass beim Übergang vom Hoch- zum Querformat die Aktivität das 3. Fragment erstellt. Ich erhalte und Fehler, da dieses Fragment nicht erstellt werden kann.

Ich habe herausgefunden, dass dieses Fragment erstellt wird, weil es sich im Backstack befindet.

Ich habe versucht, das Fragment in der onDestroy-Methode mit zu entfernen

FragmentTransaction f = fragmentManager.beginTransaction();
f.remove(mf);
f.commit();

Es wird jedoch eine Fehlermeldung angezeigt, dass ich diese Funktion nach dem onSaveInstanceState nicht verwenden kann

Was wäre der richtige Weg, um dieses Fragment aus dem Backstack zu entfernen?

Aktualisieren

Ich sollte wahrscheinlich hinzufügen, dass das Fragment, mit dem ich Probleme habe, ein mapFragment aus dieser Bibliothek ist

https://github.com/petedoyle/android-support-v4-googlemaps

Die Art, wie ich es benutze, ist so

mf = MapFragment.newInstance(1, true);

ft = fragmentManager.beginTransaction();
ft.replace(R.id.mapContainer, mf);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.addToBackStack("map");
ft.commit();
Jiduva
quelle
1
Sie müssen nur "ft.addToBackStack (" map ")" dieser Zeile entfernen.
M.Usman

Antworten:

173

Sie fügen dem Back-Status aus dem hinzu FragmentTransactionund entfernen ihn mithilfe von FragmentManagerPop-Methoden aus dem Backstack :

FragmentManager manager = getActivity().getSupportFragmentManager();
FragmentTransaction trans = manager.beginTransaction();
trans.remove(myFrag);
trans.commit();
manager.popBackStack();
user123321
quelle
61
Was passiert, wenn sich das Fragment, das Sie entfernen möchten, nicht oben auf dem Stapel befindet?
Kuno
2
Ja, ich bin es leid, nicht zu arbeiten, wenn das Fragment nicht oben auf dem Stapel steht. Ich versuche immer noch, das herauszufinden!
AJit
Haben Sie eine Lösung für dieses Problem gefunden?
An-Droide
2
Wenn Sie vorher wissen, dass das Fragment nicht Teil des Backstacks sein sollte, können Sie das "addToBackstrack (null)" weglassen.
März
4
Ich frage mich, warum ich manager.popBackStack () nach dem Entfernen aufrufen musste. Ich hätte, obwohl nur die Entfernungstransaktion es losgeworden wäre, danke
j2emanue
17

Ich habe einen Code erstellt, um zum gewünschten Backstack-Index zu springen. Er hat für meinen Zweck gut funktioniert.

dh. Ich habe Fragment1, Fragment2 und Fragment3, ich möchte von Fragment3 zu Fragment1 springen

Ich habe in Fragment3 eine Methode namens onBackPressed erstellt, die zu Fragment1 springt

Fragment3:

public void onBackPressed() {
    FragmentManager fragmentManager = getFragmentManager();
    fragmentManager.popBackStack(fragmentManager.getBackStackEntryAt(fragmentManager.getBackStackEntryCount()-2).getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
}

In der Aktivität muss ich wissen, ob mein aktuelles Fragment das Fragment3 ist, also rufe ich das onBackPressed meines Fragments auf und rufe stattdessen super auf

FragmentActivity:

@Override
public void onBackPressed() {
    Fragment f = getSupportFragmentManager().findFragmentById(R.id.my_fragment_container);
    if (f instanceof Fragment3)
    {
        ((Fragment3)f).onBackPressed();
    } else {
        super.onBackPressed();
    }
}
Klaus Skate
quelle
3
Aber der Code würde bei einer großen Anzahl von Fragmenten unordentlich werden, oder? (Ich habe 20 Fragmente)
Kathir
1

Sie zeigen Fragment in einem Container (mit id = fragmentcontainer), also entfernen Sie Fragment mit:

 Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragmentContainer);
            fragmentTransaction.remove(fragment);
            fragmentTransaction.addToBackStack(null);
            fragmentTransaction.commit();
AlimItTech
quelle
-13

Was passiert, wenn sich das Fragment, das Sie entfernen möchten, nicht oben auf dem Stapel befindet?

Dann können Sie diese Funktionen verwenden

popBackStack(int arg0, int arg1);

popBackStack(String arg0, int arg1);

Dornathal
quelle
24
Ich denke, das ist falsch, wenn Sie die Dokumentation "... alle Zustände up to that statewerden gelöscht" lesen, damit nicht genau dieses Fragment entfernt wird, sondern alles darüber im Stapel (und das Fragment selbst, abhängig vom Flag) ).
Ixx
Ich verstehe nicht, warum die Leute Dornathals Antwort und @lxx 'Kommentar ablehnen! So funktionieren Stapel per Definition !
iSWORD
2
@iSWORD Weil die Frage auch impliziert, wie Sie nur ein Fragment entfernen können, das nicht oben ist
teh.fonsi