Was bedeutet addToBackStack mit dem Parameter null?

92

Ich habe einen Kundencode. Es gibt nur eine Aktivität für alle Fragmente, dh die einzelne Aktivität verwaltet alle Fragmente.

Diese Aktivität enthält den folgenden Code für jedes Fragment am Methodenende dieses Fragments.

Zum Beispiel - Fragment MoreFragment:

MoreFragment firstFragment = new MoreFragment();
getSupportFragmentManager().beginTransaction()
.replace(R.id.article_fragment, firstFragment)
.addToBackStack(null).commit();

So,

1) Was bedeutet addToBackStack(null)a commit()?

2) Warum müssen Sie einen Nullparameter übergeben addToBackStack?

3) Wie bekomme ich dieses Fragment, nachdem es so hinzugefügt wurde?

Dieser Code scheint nutzlos zu sein, da ich den Code ohne die letzte Zeile ausgeführt habe .addToBackStack(null).commit()und er ohne Probleme ausgeführt wurde.

Mein Gott
quelle
developer.android.com/reference/android/app/… In einigen Fällen müssen Sie diese Methode aufrufen.
Luzifer
3
Sie können den Fragmentnamen als Parameter an addToBackStack (Name) anstelle von Null übergeben. Wenn Sie Null übergeben, können Sie die Methode FragmentManager.popBackStackImmediate (String name, int flags) nicht verwenden. oder popBackStack (String name, int flags); weil der Name Null war. Die popBackstack-Methoden funktionieren also nicht. Ich schlage vor, Sie übergeben den Fragmentnamen als Parameter, anstatt null zu übergeben.
Luckylukein

Antworten:

108

Was bedeutet addToBackStack (null) gefolgt von einem commit ()?

Zitieren von Dokumenten:

Durch Aufrufen von addToBackStack () wird die Ersetzungstransaktion im Backstack gespeichert, sodass der Benutzer die Transaktion stornieren und das vorherige Fragment durch Drücken der Zurück-Taste wiederherstellen kann.

Wenn Sie der Transaktion mehrere Änderungen hinzufügen (z. B. ein weiteres add () oder remove ()) und addToBackStack () aufrufen, werden alle Änderungen, die vor dem Aufruf von commit () vorgenommen wurden, als einzelne Transaktion und die Schaltfläche Zurück zum Backstack hinzugefügt wird sie alle zusammen umkehren.

Die Reihenfolge, in der Sie Änderungen an einer FragmentTransaction hinzufügen, spielt keine Rolle, außer:

Sie müssen commit()zuletzt anrufen . Wenn Sie demselben Container mehrere Fragmente hinzufügen, bestimmt die Reihenfolge, in der Sie sie hinzufügen, die Reihenfolge, in der sie in der Ansichtshierarchie angezeigt werden.

Sie müssen sich also zuletzt festlegen.

Warum müssen Sie einen Nullparameter an addToBackStack übergeben?

Es muss nicht null sein, es kann eine Zeichenfolge sein. Wenn Sie nicht möchten, übergeben Sie einfach null.

public abstract FragmentTransaction addToBackStack (String name)

Hinzugefügt in API-Level 11 Fügen Sie diese Transaktion dem Backstack hinzu. Dies bedeutet, dass die Transaktion nach dem Festschreiben gespeichert wird und ihren Vorgang umkehrt, wenn sie später vom Stapel entfernt wird.

Parametername Ein optionaler Name für diesen Backstack-Status oder null.

Über:

Dieser Code scheint nutzlos zu sein, da ich den Code ohne die letzte Zeile .addToBackStack (null) .commit () ausgeführt habe und er ohne Probleme ausgeführt wurde

Wenn Sie zum vorherigen Fragment navigieren möchten, fügen Sie es dem Backstack hinzu. Es hängt also davon ab, ob Sie das Fragment zum Backstack hinzufügen möchten.

Wie bekomme ich dieses Fragment, nachdem es so hinzugefügt wurde?

Sie haben bereits die Fragmentinstanz firstFragment. Ich weiß also nicht, was Sie damit meinen, dass Sie das Fragment später erhalten.

Mehr Informationen @

http://developer.android.com/guide/components/fragments.html

http://developer.android.com/reference/android/app/FragmentTransaction.html#addToBackStack(java.lang.String)

Raghunandan
quelle
Sie können dies auch aus dem API-Dokument zu Ihrer Antwort hinzufügen: Fügen Sie diese Transaktion dem Backstack hinzu. Dies bedeutet, dass die Transaktion nach dem Festschreiben gespeichert wird und ihren Vorgang umkehrt, wenn sie später vom Stapel entfernt wird. Parametername Ein optionaler Name für diesen Backstack-Status oder null.
Dyrborg
Wie ich verstanden habe, besteht der gesamte Zweck des Hinzufügens zum Backstack darin, eine Navigation durchzuführen, wie wir es mit der Zurück-Schaltfläche tun, um zum vorherigen Fragment zu gelangen.
Mein Gott
OK, wenn Sie einen Parameter an addToBackStack übergeben, warum müssen wir dann tun, getFragmentManager().popBackStackImmediate()wenn die Zurück-Schaltfläche dies allein mit / ohne Parameterübergabe tun kann? Siehe die Antwort von - stackoverflow.com/questions/21156153/…
Mein Gott
@VedPrakash brauchst du nicht. Auch das ist eine andere Frage und Antwort insgesamt. Sie können es leicht selbst herausfinden, indem Sie zwei Fragmente haben, die sie zum hinteren Stapel hinzufügen und den Zurück-Knopf drücken
Raghunandan
@VedPrakash lesen Verwalten von Fragmenten @ developer.android.com/guide/components/fragments.html
Raghunandan
16

Die tagZeichenfolge in addToBackStack(String name)gibt eine Möglichkeit, den Backstack für einen späteren Pop direkt an dieser Position zu lokalisieren. Es sollte in der Methode verwendet werden popToBackStack(String name, int flags):

Pop den letzten Fragmentübergang vom Fragment-Backstack des Managers. Diese Funktion ist asynchron - sie stellt die Anforderung zum Popup in die Warteschlange, die Aktion wird jedoch erst ausgeführt, wenn die Anwendung zu ihrer Ereignisschleife zurückkehrt.

name: Wenn nicht null, ist dies der Name eines vorherigen Back-Status, nach dem gesucht werden soll. Wenn gefunden, werden alle Zustände bis zu diesem Zustand gelöscht. Mit dem Flag POP_BACK_STACK_INCLUSIVE kann gesteuert werden, ob der benannte Status selbst gelöscht wird. Wenn null, wird nur der oberste Status angezeigt.

Flags: Entweder 0 oder POP_BACK_STACK_INCLUSIVE.

Mit anderen Worten, es wird Ihren Backstack platzen lassen, bis es das Fragment findet, das vom namein hinzugefügt wurde addToBackStack(String name).

Wenn Sie beispielsweise dem Fragmentmanager eine Reihe von Ergänzungen oder Ersetzungen mit den Namen "frag1", "frag2", "frag3", "frag4" vornehmen und später direkt zu dem mit addToBackStack ("hinzugefügten Fragment 2 zurückkehren möchten) frag2 "), rufst du an popToBackStack("frag2", 0).

So,

  • Verwendung .addToBackStack("fragName"): Wenn Sie später popToBackStack(String name, int flags)mehr als einen Backstack ablegen möchten .

  • Verwendung .addToBackStack(null): Wenn Sie später nicht mehr als einen Backstack einfügen möchten, aber dennoch einen nach dem anderen einfügen möchten. Tun Sie dies auch dann, wenn Sie popToBackStack () nicht explizit aufrufen, sondern stattdessen die Back-Press-Standardimplementierung den Back-Stack verarbeiten lassen.

  • Verwendung .disallowAddToBackStack(): Wenn Sie nicht möchten, drücken Sie zurück oder rufen Sie popBackStack () explizit auf. Dadurch wird sichergestellt, dass kein Teil des Codes .addToBackStack () verwendet.

Allan Veloso
quelle
1

Ihre Antworten sind veraltet. Wenn Sie dem Backstack keine Fragmente hinzufügen möchten, sollten Sie den folgenden Codeausschnitt verwenden:

    public static void replaceFragment (@NonNull FragmentManager fragmentManager,
            @NonNull Fragment fragment, int frameId){

        checkNotNull(fragmentManager);
        checkNotNull(fragment);
        FragmentTransaction transaction = fragmentManager.beginTransaction();
        transaction.replace(frameId, fragment);
        transaction.disallowAddToBackStack(); // <-- This makes magic!
        transaction.commit();
    }

Unten haben Sie ein süßes Beispiel, wie man es benutzt:

GameFragment fragment = GameFragment.newInstance(mGameObject, currentQuestion);
ActivityUtils.replaceFragment(getFragmentManager(), fragment, R.id.main);
Eliasz Kubala
quelle
6
Veraltet wo? Ich sehe nichts in der Dokumentation oder der FragmentTransaction-Quelle.
Rup
3
Hüten Sie sich vor, wenn Sie disallowAddToBackStack, dann werden Sie zukünftig Anrufe addToBackStack Illegal werfen. Wenn addToBackStack bereits aufgerufen wurde, löst diese Methode eine IllegalStateException aus.
Kathir