Ich spiele mit Fragmenten in Android.
Ich weiß, dass ich ein Fragment mithilfe des folgenden Codes ändern kann:
FragmentManager fragMgr = getSupportFragmentManager();
FragmentTransaction fragTrans = fragMgr.beginTransaction();
MyFragment myFragment = new MyFragment(); //my custom fragment
fragTrans.replace(android.R.id.content, myFragment);
fragTrans.addToBackStack(null);
fragTrans.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
fragTrans.commit();
Meine Frage ist, wie ich in einer Java-Datei die aktuell angezeigte Fragment-Instanz erhalten kann.
Antworten:
Wenn Sie das Fragment zu Ihrer Transaktion hinzufügen, sollten Sie ein Tag verwenden.
... und später, wenn Sie überprüfen möchten, ob das Fragment sichtbar ist:
Siehe auch http://developer.android.com/reference/android/app/Fragment.html
quelle
Ich weiß, dass es ein alter Beitrag ist, hatte aber vorher auch Probleme damit. Eine Lösung gefunden, die dies in der
onBackStackChanged()
Hörfunktion tun sollteDies funktionierte für mich, da ich nicht jedes Fragment durchlaufen wollte, um eines zu finden, das sichtbar ist. Hoffe, es hilft auch jemand anderem.
quelle
.getFragmentManager
inkompatibler Typandroid.support.app.v4.Fragment
getSupportFragmentManager
findFragmentByTag()
anstelle von verwendenfindFragmentById
, wenn Sie Tag zum Fragmentieren beim Hinzufügen zufragmentManager.beginTransaction() .add(containerID, frag, fragmentTag) .addToBackStack(fragmentTag) .commit();
Hier ist meine Lösung, die ich für Szenarien mit geringen Fragmenten nützlich finde
quelle
fragment
kann in bestimmten Szenarien null sein, z. B. wenn Sie den Backstack öffnen. Also besser nutzenif (fragment != null && fragment.isVisible())
.Jedes Mal, wenn Sie ein Fragment anzeigen, müssen Sie es in den Hintergrund stellen:
Und wenn Sie dann ein aktuelles Fragment benötigen, können Sie diese Methode verwenden:
quelle
addToBackStack(tag)
, aber was ist, wenn Sie das Fragment nicht zum Backstack hinzufügen möchten?Was ich verwende, um das aktuelle Anzeigefragment zu finden, befindet sich im folgenden Code. Es ist einfach und funktioniert mittlerweile bei mir. Es läuft in der Aktivität, die die Fragmente enthält
quelle
fragManager.getFragments().size()
anstatt,getBackStackEntryCount()
da sie nicht unbedingt gleich sind (was mein Fall ist). Andernfalls können Sie mit IndexOutOfBoundsExceptionKotlin Weg;
quelle
getFragments()
Funktion, die API 26 und höher ist.Der reaktive Weg:
quelle
Meine Methode basiert auf try / catch wie folgt:
Aber es kann einen besseren Weg geben ...
quelle
Nun, diese Frage erhielt viele Ansichten und Aufmerksamkeit, enthielt aber immer noch nicht die einfachste Lösung von meinem Ende - getFragments () zu verwenden.
quelle
getSupportFragmentManager().getFragments()
Sie erhalten eine Liste zurück, die jedoch Nullwerte enthalten kann, wenn das neueste Fragment gerade aus dem Backstack entfernt wurde. Gl.: Wenn Sie sich innerhalb deronBackStackChanged()
Methode vergewissern undpopBackStack()
irgendwo anrufen ,mCurrentFragment
wird das seinnull
.Sie können abfragen, welches Fragment in Ihren Aktivitäten-Inhaltsrahmen geladen wird, und die Fragmentklasse oder das Fragment 'einfacher Name' (als Zeichenfolge) abrufen.
Verwendungszweck:
Ausgänge:
quelle
Es ist etwas spät, aber für alle, die interessiert sind: Wenn Sie den Index Ihres gewünschten Fragments in FragmentManager kennen, holen Sie sich einfach einen Verweis darauf und suchen Sie nach der Funktion isMenuVisible ()! Hier :
Wenn es
true
für den Benutzer sichtbar ist und so weiter!quelle
isVisible() == true
,getView() != null
. Außerdem ist in meinem CodegetBackStackEntryCount
immer Null. Obwohl ich keine Menüs verwende,isMenuVisible()
ist dies bislang die einzige Diskriminante, die zuverlässig auf das derzeit "aktive" Fragment zu verweisen scheint. ty1)
2)
3)
quelle
Wenn Sie hierher kommen und Kotlin verwenden:
R.id.fragment_container
ist das,id
wo dasfragment
auf ihrem präsentiertactivity
Oder wenn Sie eine schönere Lösung wollen:
quelle
Inspiriert von Tainys Antwort, hier sind meine zwei Cent. Wenig modifiziert von den meisten anderen Implementierungen.
Ersetzen Sie
"myActivity"
durch "dies", wenn es sich um Ihre aktuelle Aktivität handelt oder verwenden Sie einen Verweis auf Ihre Aktivität.quelle
Es gibt eine Methode namens
findFragmentById()
inSupportFragmentManager
. Ich benutze es im Aktivitätscontainer wie:So erhalten Sie Ihren Strom
Fragment
. Wenn Sie benutzerdefinierte habenFragment
und überprüfen müssen, wasFragment
es ist, verwende ich normalerweiseinstanceof
:quelle
Wenn Sie Folgendes verwenden
AndroidX Navigation
:Weitere Informationen zu dieser Navigationskomponente finden Sie unter: https://developer.android.com/guide/navigation/navigation-getting-started
quelle
your_navhost
.Dies ist ein einfacher Weg, um das aktuelle Fragment zu erhalten.
quelle
Sevs Antwort funktioniert, wenn Sie die Zurück-Taste drücken oder auf andere Weise den Backstack ändern.
Ich habe allerdings etwas anderes gemacht. Ich habe ein Backstack-Change-Listener-Setup für ein Basisfragment und seine abgeleiteten Fragmente, und dieser Code befindet sich im Listener:
quelle
Das ist Arbeit für mich. Ich hoffe, das wird jemandem helfen.
quelle
Wenn Sie die aktuelle Instanz von Fragment aus der übergeordneten Aktivität erhalten, können Sie dies einfach tun
Dies ist tatsächlich die aktuelle Instanz des Fragments, die in der Ansicht ausgefüllt ist. Ich hatte das gleiche Problem. Ich musste dasselbe Fragment zweimal laden und eines auf dem Backstack halten.
Die folgende Methode funktioniert nicht. Es wird nur ein Fragment mit dem Tag angezeigt. Verschwenden Sie keine Zeit mit dieser Methode. Ich bin sicher, dass es seine Verwendung hat, aber die neueste Version desselben Fragments zu erhalten, gehört nicht dazu.
quelle
Testen Sie diese Lösung. Es hat bei mir funktioniert, das aktuelle Fragment zu bekommen.
quelle
quelle
Nun, ich denke, dies ist die direkteste Antwort auf diese Frage. Ich hoffe das hilft.
quelle
Hier ist eine Kotlin-Lösung:
Vereinfachter Weg:
quelle
Einfacher Weg, das zu tun:
quelle
In der Hauptaktivität wird die Methode onAttachFragment (Fragmentfragment) aufgerufen, wenn ein neues Fragment an die Aktivität angehängt wird. Bei dieser Methode können Sie die Instanz des aktuellen Fragments abrufen. Die onAttachFragment-Methode wird jedoch nicht aufgerufen, wenn ein Fragment vom Backstack entfernt wird, dh wenn die Zurück-Taste gedrückt wird, um das oberste Fragment auf den Stapel zu legen. Ich suche immer noch nach einer Rückrufmethode, die in der Hauptaktivität ausgelöst wird, wenn ein Fragment innerhalb der Aktivität sichtbar wird.
quelle
Bei gescrollten Fragmenten können Sie, wenn Sie eine Instanz der ViewPager-Klasse verwenden, mVeiwPager, mViewPager.getCurrentItem () aufrufen, um die aktuelle Fragment-Int-Nummer abzurufen.
in MainLayout.xml
in MainActivity.kt
quelle
Ich fand
findFragmentByTag
es nicht so bequem. Wenn SieString currentFragmentTag
in IhremActivity
oder Elternteil habenFragment
, müssen Sie es speichernonSaveInstanceState
und wiederherstellenonCreate
. Selbst wenn Sie dies tun, wenn dieActivity
neu erstellt,onAttachFragment
wird vor genanntonCreate
, so dass Sie nicht verwenden können ,currentFragmentTag
inonAttachFragment
(z. B. einige Ansichten aktualisieren basierend aufcurrentFragmentTag
), weil es die Macht noch nicht wiederhergestellt.Ich benutze den folgenden Code:
Das Dokument des
FragmentManager
Staates, dassWenn Sie Dinge tun müssen, die auf dem aktuellen Fragmenttyp basieren, verwenden Sie einfach
getCurrentFragment() instance of MyFragment
anstelle voncurrentFragmentTag.equals("my_fragment_tag")
.Beachten Sie, dass
getCurrentFragment()
inonAttachFragment
nicht das AnhängenFragment
, sondern das vorherige angehängte erhalten wird.quelle
Ich musste dies erst kürzlich tun und keine der Antworten hier passte wirklich zu diesem Szenario.
Wenn Sie sicher sind, dass nur ein Fragment sichtbar ist (Vollbild), möchten Sie wirklich herausfinden, was sich oben im Backstack befindet. Zum Beispiel, als ein
Kotlin
fürFragment
:Und benutze es wie:
quelle
Sie können dies sehr einfach auch mit einer URL in logcat tun, die Sie zum Quellcode des aktuellen Fragmentquellcodes umleitet. Zunächst müssen Sie einen OnBackStackChangedListener in Host-Aktivitäten wie - hinzufügen.
Und die OnBackStackChangedListener- Implementierung ist -
Und die Methode getStackTopName () lautet -
quelle