115 votes

obtenir le dernier fragment dans le backstack

Comment puis-je obtenir la dernière instance de fragment ajoutée dans backstack (si je ne connais pas le tag et l'id du 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 ??

162voto

deepak goel Points 1376

Vous pouvez utiliser le getName() méthode de FragmentManager.BackStackEntry qui a été introduit dans le niveau 14 de l'API. Cette méthode renverra une balise qui est celle que vous avez utilisée lorsque vous avez ajouté le fragment au backstack à l'aide de la commande addTobackStack(tag) .

int index = getActivity().getFragmentManager().getBackStackEntryCount() - 1
FragmentManager.BackStackEntry backEntry = getFragmentManager().getBackStackEntryAt(index);
String tag = backEntry.getName();
Fragment fragment = getFragmentManager().findFragmentByTag(tag);

Vous devez vous assurer que vous avez ajouté le fragment à la pile arrière comme ceci :

fragmentTransaction.addToBackStack(tag);

0 votes

C'est utile. Indépendamment de l'obtention du fragment qui a été ajouté à la pile récemment, nous pouvons obtenir n'importe quel fragment de la pile par son nom.

25 votes

Afin de trouver un fragment par balise, il doit être ajouté/remplacé par la même balise. FragmentTransaction.add(int containerViewId, Fragment fragment, String tag) ou FragmentTransaction.replace(int containerViewId, Fragment fragment, String tag) doc

3 votes

Le problème est que si vous avez un fragment dans la pile arrière deux fois, vous ne pouvez pas récupérer un fragment spécifique lorsque vous n'avez que l'index ou l'entité backstackentry.

48voto

almaz_from_kazan Points 1996
FragmentManager.findFragmentById(fragmentsContainerId) 

fonction renvoie le lien vers le haut Fragment dans le backstack. Exemple d'utilisation :

    fragmentManager.addOnBackStackChangedListener(new OnBackStackChangedListener() {
        @Override
        public void onBackStackChanged() {
            Fragment fr = fragmentManager.findFragmentById(R.id.fragmentsContainer);
            if(fr!=null){
                Log.e("fragment=", fr.getClass().getSimpleName());
            }
        }
    });

2 votes

Cette réponse fonctionne bien dans mon projet puisque j'ajoute tous les fragments sauf le fragment Root à la pile arrière. Mais je suppose que cette réponse ne fonctionnera pas si le dernier fragment ajouté n'a pas été ajouté à la pile arrière.

5voto

Eduardo Points 46

La réponse donnée par Deepak Goel ne fonctionne pas pour moi parce que je reçois toujours des nullités de la part de entry.getName() ;

Ce que je fais, c'est de définir une balise pour le fragment de cette façon :

ft.add(R.id.fragment_container, fragmentIn, FRAGMENT_TAG);

Où ft est ma transaction de fragment et FRAGMENT_TAG est l'étiquette. Ensuite, j'utilise ce code pour obtenir le fragment :

Fragment prev_fragment = fragmentManager.findFragmentByTag(FRAGMENT_TAG);

0 votes

Cela ne fonctionnera que si vous donnez à tous les fragments la même étiquette, ce qui n'est pas une bonne idée si vous voulez retrouver un fragment spécifique plus tard.

3voto

blackbelt Points 45840

Vous pouvez utiliser getBackStackEntryAt() . Pour savoir combien d'entrées l'activité détient dans le backstack vous pouvez utiliser getBackStackEntryCount()

int lastFragmentCount = getBackStackEntryCount() - 1;

14 votes

Mais comment puis-je obtenir le dernier fragment dans le backstack ? Le popBackStackEntryAt() ne renvoie qu'une instance de BackStackEntry, PAS le fragment.

0 votes

Oui, vous avez raison, mais chaque BackStackEntry possède un identifiant que vous pouvez récupérer avec getId(). Vous pouvez utiliser cet identifiant afin de récupérer le fragment.

1 votes

Pour récupérer le dernier fragment : getBackStackEntryCount() - 1

2voto

Arne Evertsson Points 11286

Gardez votre propre pile arrière : myBackStack . Comme vous Add un fragment au FragmentManager et l'ajouter également à myBackStack . Sur onBackStackChanged() pop de myBackStack lorsque sa longueur est supérieure à getBackStackEntryCount .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X