Wie kann ich die neueste Fragmentinstanz im Backstack hinzufügen lassen (wenn ich das Fragment-Tag und die ID nicht kenne)?
FragmentManager fragManager = activity.getSupportFragmentManager();
FragmentTransaction fragTransacion = fragMgr.beginTransaction();
/****After add , replace fragments
(some of the fragments are add to backstack , some are not)***/
//HERE, How can I get the latest added fragment from backstack ??
android
android-fragments
back-stack
Leem.fin
quelle
quelle
FragmentTransaction.add(int containerViewId, Fragment fragment, String tag)
oderFragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)
docstack
wenn ich es nicht über eine Pop-Methode auf das Fragment zugreifen kann?Die Funktion gibt den Link
Fragment
im Backstack nach oben zurück. Anwendungsbeispiel:quelle
Ich habe persönlich viele dieser Lösungen ausprobiert und am Ende diese funktionierende Lösung gefunden:
Fügen Sie diese Dienstprogrammmethode hinzu, die im Folgenden mehrmals verwendet wird, um die Anzahl der Fragmente in Ihrem Backstack zu ermitteln:
Wenn Sie dann Ihr Fragment mithilfe der FragmentTransaction-Methode hinzufügen / ersetzen, generieren Sie ein eindeutiges Tag für Ihr Fragment (z. B. mithilfe der Anzahl der Fragmente in Ihrem Stapel):
Schließlich können Sie mit dieser Methode eines Ihrer Fragmente in Ihrem Backstack finden:
Daher können Sie das oberste Fragment in Ihrem Backstack leicht abrufen, indem Sie Folgendes aufrufen:
Hoffe das hilft!
quelle
Diese Hilfsmethode ruft ein Fragment vom oberen Rand des Stapels ab:
quelle
Kotlin
quelle
.lastOrNull()
fallsfragments
leer ist.Der fragmentMananger enthält eine Liste von Fragmenten. Beachten Sie, dass durch das Entfernen eines Fragments die Listengröße nicht verringert wird (der Fragmenteintrag wird einfach auf null gesetzt). Eine gültige Lösung wäre daher:
quelle
getFragments()
Gibt eine verkürzte Sammlung von Fragmenten zurück. Vielleicht ist der letzte sichtbar, aber nicht viele andere.Die Antwort von deepak goel funktioniert bei mir nicht, weil ich immer null bekomme
entry.getName()
;Ich setze ein Tag auf folgende Weise auf das Fragment:
Wobei ft meine Fragmenttransaktion und
FRAGMENT_TAG
das Tag ist. Dann benutze ich diesen Code, um das Fragment zu erhalten:quelle
Habe gerade @roghayeh hosseini (richtige) Antwort genommen und es in Kotlin für die hier 2017 gemacht :)
* Dies sollte innerhalb einer Aktivität aufgerufen werden.
Genießen :)
quelle
Sie können getBackStackEntryAt () verwenden . Um zu wissen, wie viele Einträge die Aktivität im Backstack enthält, können Sie getBackStackEntryCount () verwenden.
quelle
Ich werde Deepak Goels Antwort etwas hinzufügen, da viele Leute, ich eingeschlossen, mit seiner Methode eine Null bekommen haben. Anscheinend sollten Sie dies folgendermaßen tun, damit das Tag funktioniert, wenn Sie dem Backstack ein Fragment hinzufügen:
Sie müssen dasselbe Tag zweimal hinzufügen.
Ich hätte kommentiert, aber ich habe keine 50 Ruf.
quelle
Behalten Sie Ihren eigenen Backstack :
myBackStack
. Wenn SieAdd
ein Fragment zum habenFragmentManager
, fügen Sie es auch hinzumyBackStack
. InonBackStackChanged()
Pop ab,myBackStack
wenn seine Länge größer als istgetBackStackEntryCount
.quelle
Es sieht so aus, als hätte sich etwas zum Besseren geändert, da der folgende Code perfekt für mich funktioniert, aber ich habe ihn in den bereits bereitgestellten Antworten nicht gefunden.
Kotlin:
Java:
quelle
Wenn Sie verwenden
addToBackStack()
, können Sie folgenden Code verwenden.List<Fragment> fragments = fragmentManager.getFragments(); activeFragment = fragments.get(fragments.size() - 1);
quelle
Tatsächlich wird dem Stapel kein aktuelles Fragment hinzugefügt, da Sie mehrere oder Fragmente in einer einzigen Transaktion zum Stapel hinzufügen oder einfach Fragmente entfernen können, ohne ein neues hinzuzufügen.
Wenn Sie wirklich einen Fragmentstapel haben möchten und über seinen Index im Stapel auf ein Fragment zugreifen können möchten, sollten Sie eine Abstraktionsschicht über dem
FragmentManager
und seinem Backstack haben. So geht's:Anstatt nun das Hinzufügen und Fragmente durch den Aufruf zu entfernen
FragmentManager
direkt, sollten Sie verwendenpush()
,replace()
undpop()
MethodenFragmentStackManager
. Und Sie können auf das oberste Fragment zugreifen, indem Sie einfach anrufenstack.get(stack.size() - 1)
.Aber wenn Sie Hacks mögen, habe ich andere Möglichkeiten, ähnliche Dinge zu tun. Das einzige, was ich erwähnen muss, ist, dass diese Hacks nur mit Support-Fragmenten funktionieren.
Der erste Hack besteht darin, alle aktiven Fragmente zum Fragmentmanager hinzuzufügen. Wenn Sie nur Fragmente einzeln ersetzen und die vom Stapel entfernen, gibt diese Methode das oberste Fragment zurück:
Der zweite Ansatz ist ereignisreicher und ermöglicht es Ihnen, alle Fragmente der letzten Transaktion hinzuzufügen, für die Folgendes
addToBackStack
aufgerufen wurde:Bitte beachten Sie, dass Sie in diesem Fall diese Klasse in ein
android.support.v4.app
Paket packen müssen.quelle
Oder Sie fügen einfach ein Tag hinzu, wenn Sie Fragmente hinzufügen, die ihrem Inhalt entsprechen, und verwenden ein einfaches statisches String-Feld (Sie können es auch im Aktivitätsinstanz-Bundle in der onSaveInstanceState (Bundle) -Methode speichern), um das zuletzt hinzugefügte Fragment-Tag zu speichern und dieses Fragment von Tag () abzurufen. jederzeit brauchen Sie ...
quelle
Die höchste Antwort (Deepak Goel) hat bei mir nicht gut funktioniert. Irgendwie wurde das Tag nicht richtig hinzugefügt.
Am Ende habe ich nur die ID des Fragments durch den Flow gesendet (mit Absichten) und sie direkt vom Fragmentmanager abgerufen.
quelle