Comment puis-je obtenir la dernière instance de fragment ajoutée dans Backstack (si je ne connais pas la balise et l'ID de fragment)?
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
la source
la source
FragmentTransaction.add(int containerViewId, Fragment fragment, String tag)
orFragmentTransaction.replace(int containerViewId, Fragment fragment, String tag)
docstack
si je ne peux pas accéder au fragment via une méthode pop?La fonction retourne le lien vers le haut
Fragment
de la pile d'arrière-plan. Exemple d'utilisation:la source
J'ai personnellement essayé plusieurs de ces solutions et je me suis retrouvé avec cette solution fonctionnelle:
Ajoutez cette méthode utilitaire qui sera utilisée plusieurs fois ci-dessous pour obtenir le nombre de fragments dans votre backstack:
Ensuite, lorsque vous ajoutez / remplacez votre fragment en utilisant la méthode FragmentTransaction, générez une balise unique à votre fragment (par exemple: en utilisant le nombre de fragments dans votre pile):
Enfin, vous pouvez trouver l'un de vos fragments dans votre backstack avec cette méthode:
Par conséquent, la récupération du fragment supérieur de votre backstack peut être facilement réalisée en appelant:
J'espère que cela t'aides!
la source
cette méthode d'assistance récupère un fragment du haut de la pile:
la source
Kotlin
la source
.lastOrNull()
au cas oùfragments
est vide.Il existe une liste de fragments dans le fragmentMananger. Sachez que la suppression d'un fragment ne fait pas diminuer la taille de la liste (l'entrée de fragment devient simplement nulle). Par conséquent, une solution valable serait:
la source
getFragments()
renvoie une collection raccourcie de fragments. Peut-être que le dernier est visible, mais pas beaucoup d'autres.La réponse donnée par deepak goel ne fonctionne pas pour moi parce que j'obtiens toujours null
entry.getName()
;Ce que je fais est de définir une balise sur le fragment de cette façon:
Où ft est ma transaction de fragment et
FRAGMENT_TAG
est la balise. Ensuite, j'utilise ce code pour obtenir le fragment:la source
Je viens de prendre la réponse @roghayeh hosseini (correcte) et de l'avoir fait à Kotlin pour ceux qui sont ici en 2017 :)
* Cela doit être appelé depuis l'intérieur d'une activité.
Prendre plaisir :)
la source
vous pouvez utiliser getBackStackEntryAt () . Afin de savoir combien d'entrées l'activité détient dans la backstack, vous pouvez utiliser getBackStackEntryCount ()
la source
J'ajouterai quelque chose à la réponse de Deepak Goel car beaucoup de gens, moi y compris, obtenaient une valeur nulle en utilisant sa méthode. Apparemment, pour que la balise fonctionne lorsque vous ajoutez un fragment à la backstack, vous devriez le faire comme ceci:
Vous devez ajouter deux fois la même balise.
J'aurais commenté mais je n'ai pas 50 réputation.
la source
Gardez votre dos pile:
myBackStack
. En tant queAdd
fragment duFragmentManager
, ajoutez-le également àmyBackStack
. EnonBackStackChanged()
pop à partir demyBackStack
quand sa longueur est supérieure àgetBackStackEntryCount
.la source
On dirait que quelque chose a changé pour le mieux, car le code ci-dessous fonctionne parfaitement pour moi, mais je ne l'ai pas trouvé dans les réponses déjà fournies.
Kotlin:
Java:
la source
Si vous utilisez
addToBackStack()
, vous pouvez utiliser le code suivant.List<Fragment> fragments = fragmentManager.getFragments(); activeFragment = fragments.get(fragments.size() - 1);
la source
En fait, il n'y a pas de dernier fragment ajouté à la pile car vous pouvez en ajouter plusieurs ou fragments à la pile en une seule transaction ou simplement supprimer des fragments sans en ajouter un nouveau.
Si vous voulez vraiment avoir une pile de fragments et pouvoir accéder à un fragment par son index dans la pile, vous feriez mieux d'avoir une couche d'abstraction sur le
FragmentManager
et sa backstack. Voici comment vous pouvez le faire:Maintenant , au lieu d'ajouter et de supprimer des fragments en appelant
FragmentManager
directement, vous devez utiliserpush()
,replace()
et lespop()
méthodes deFragmentStackManager
. Et vous pourrez accéder au fragment le plus haut en appelant simplementstack.get(stack.size() - 1)
.Mais si vous aimez les hacks, j'ai d'autres moyens de faire des choses similaires. La seule chose que je dois mentionner est que ces hacks ne fonctionneront qu'avec des fragments de support.
Le premier hack consiste simplement à ajouter tous les fragments actifs au gestionnaire de fragments. Si vous remplacez simplement les fragments un par un et sortez le de la pile, cette méthode renverra le fragment le plus haut:
La deuxième approche est un événement plus hacky et vous permet d'obtenir tous les fragments ajoutés dans la dernière transaction pour laquelle
addToBackStack
a été appelée:Veuillez noter que dans ce cas, vous devez mettre cette classe dans le
android.support.v4.app
package.la source
Ou vous pouvez simplement ajouter une balise lors de l'ajout de fragments correspondant à leur contenu et utiliser un champ de chaîne statique simple (vous pouvez également l'enregistrer dans le bundle d'instances d'activité dans la méthode onSaveInstanceState (Bundle)) pour contenir la dernière balise de fragment ajoutée et obtenir ce fragment byTag () à tout moment dont vous avez besoin ...
la source
La réponse la plus élevée (Deepak Goel) n'a pas bien fonctionné pour moi. D'une manière ou d'une autre, la balise n'a pas été ajoutée correctement.
J'ai fini par envoyer simplement l'ID du fragment à travers le flux (en utilisant les intentions) et le récupérer directement à partir du gestionnaire de fragments.
la source