Quelle est la signification de addToBackStack avec un paramètre nul?

93

J'ai un code client. Il n'y a qu'une seule activité pour tous les fragments, c'est-à-dire que la seule activité est de gérer tous les fragments.

Cette activité contient le code suivant pour tout fragment à la fin de la méthode de ce fragment-

Par exemple - fragment MoreFragment:

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

Alors,

1) Quelle est la signification de addToBackStack(null)suivi d'un commit()?

2) Pourquoi devez-vous passer un paramètre nul à addToBackStack?

3) Comment obtenir ce fragment après avoir été ajouté comme ça?

On dirait que ce code est inutile car j'ai exécuté le code sans la dernière ligne .addToBackStack(null).commit()et il a fonctionné sans aucun problème.

Mon Dieu
la source
developer.android.com/reference/android/app/… dans certains cas, vous devez appeler cette méthode.
Lucifer
3
Vous pouvez transmettre le nom du fragment en tant que paramètre à addToBackStack (nom) au lieu de Null. Si vous passez Null, vous ne pourrez pas utiliser la méthode FragmentManager.popBackStackImmediate (String name, int flags); ou popBackStack (nom de chaîne, indicateurs int); parce que le nom était nul. Les méthodes popBackstack ne fonctionneront donc pas. Je vous suggère de passer le nom du fragment comme paramètres au lieu de passer null.
luckylukein

Réponses:

111

Quelle est la signification de addToBackStack (null) suivi d'un commit ()?

Citant des documents:

En appelant addToBackStack (), la transaction de remplacement est enregistrée dans la pile arrière afin que l'utilisateur puisse annuler la transaction et ramener le fragment précédent en appuyant sur le bouton Retour.

Si vous ajoutez plusieurs modifications à la transaction (comme un autre add () ou remove ()) et appelez addToBackStack (), toutes les modifications appliquées avant d'appeler commit () sont ajoutées à la pile arrière en une seule transaction et le bouton Retour va les inverser tous ensemble.

L'ordre dans lequel vous ajoutez des modifications à une FragmentTransaction n'a pas d'importance, sauf:

Vous devez appeler en commit()dernier. Si vous ajoutez plusieurs fragments au même conteneur, l'ordre dans lequel vous les ajoutez détermine l'ordre dans lequel ils apparaissent dans la hiérarchie des vues.

Il faut donc s'engager à la fin.

Pourquoi avez-vous besoin de passer un paramètre nul à addToBackStack?

Il n'a pas besoin d'être nul, cela peut être une chaîne. Si vous ne le souhaitez pas, transmettez simplement null.

public abstract FragmentTransaction addToBackStack (nom de chaîne)

Ajouté au niveau d'API 11 Ajoutez cette transaction à la pile arrière. Cela signifie que la transaction sera mémorisée après sa validation et inversera son opération lorsqu'elle sera ensuite retirée de la pile.

Paramètres nom Nom facultatif pour cet état de la pile arrière, ou null.

Concernant:

On dirait que ce code est inutile car j'ai exécuté le code sans la dernière ligne .addToBackStack (null) .commit () et il a fonctionné sans aucun problème

Si vous souhaitez accéder au fragment précédent, ajoutez-le à backstack. Cela dépend donc si vous souhaitez ajouter le fragment à la backstack.

Comment obtenir ce fragment après avoir été ajouté comme ça?

Vous disposez déjà de l'instance de fragment firstFragment. Donc je ne sais pas ce que vous entendez par obtenir le fragment plus tard.

Plus d'information @

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

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

Raghunandan
la source
Vous pouvez également ajouter ceci à votre réponse à partir du document API: Ajoutez cette transaction à la pile arrière. Cela signifie que la transaction sera mémorisée après sa validation et inversera son opération lorsqu'elle sera ensuite retirée de la pile. Paramètres nom Nom facultatif pour cet état de la pile arrière, ou null.
Dyrborg
Donc, comme je l'ai compris, tout le but de l'ajout à backstack est d'effectuer la navigation comme nous le faisons avec le bouton retour pour aller au fragment précédent?
Mon Dieu
ok donc si vous passez un paramètre à addToBackStack alors pourquoi nous devons le faire getFragmentManager().popBackStackImmediate()si le bouton retour peut le faire seul avec / sans passage de paramètre? Voir la réponse de - stackoverflow.com/questions/21156153/…
Mon Dieu
@VedPrakash dont vous n'avez pas besoin. C'est aussi une question et une réponse différentes. Vous pouvez facilement le découvrir en ayant deux fragments en les ajoutant à la pile arrière et en appuyant sur le bouton retour
Raghunandan
@VedPrakash a lu la gestion des fragments @ developer.android.com/guide/components/fragments.html
Raghunandan
17

La tagchaîne in addToBackStack(String name)donne un moyen de localiser la pile arrière pour une pop ultérieure directement à cet emplacement. Il voulait être utilisé dans la méthode popToBackStack(String name, int flags):

Pop la dernière transition de fragment de la pile arrière de fragments du gestionnaire. Cette fonction est asynchrone - elle met en file d'attente la demande de pop, mais l'action ne sera pas exécutée tant que l'application ne retournera pas à sa boucle d'événements.

name: s'il n'est pas nul, il s'agit du nom d'un état précédent précédent à rechercher; s'il est trouvé, tous les états jusqu'à cet état seront affichés. L'indicateur POP_BACK_STACK_INCLUSIVE peut être utilisé pour contrôler si l'état nommé lui-même est popped. Si null, seul l'état supérieur est affiché.

flags: Soit 0 ou POP_BACK_STACK_INCLUSIVE.

En d'autres termes, il fera apparaître votre pile arrière jusqu'à ce qu'il trouve le fragment qui a été ajouté par le namein addToBackStack(String name).

Par exemple, si vous effectuez une série d'ajouts ou de remplacements au gestionnaire de fragments en donnant les noms "frag1", "frag2", "frag3", "frag4" et que vous souhaitez ultérieurement revenir directement au fragment 2 ajouté avec addToBackStack (" frag2 "), vous appelez popToBackStack("frag2", 0).

Alors,

  • Utilisation .addToBackStack("fragName"): si vous souhaitez ultérieurement popToBackStack(String name, int flags)faire apparaître plus d'une pile arrière.

  • Utilisation .addToBackStack(null): Si vous ne voulez pas faire apparaître plus d'une pile arrière plus tard, mais que vous voulez quand même en faire apparaître une à la fois. Faites cela même si vous n'appelez pas explicitement popToBackStack (), mais laissez à la place l'implémentation par défaut back press gérer la pile arrière.

  • Utilisation .disallowAddToBackStack(): Si vous ne voulez pas appuyer sur le dos ou appeler popBackStack () explicitement. Il s'assurera qu'aucune partie du code n'utilise .addToBackStack ().

Allan Veloso
la source
1

Vos réponses sont obsolètes. Si vous ne souhaitez pas ajouter de fragments à la pile arrière, vous devez utiliser l'extrait de code ci-dessous:

    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();
    }

Ci-dessous, vous avez un exemple mignon de son utilisation:

GameFragment fragment = GameFragment.newInstance(mGameObject, currentQuestion);
ActivityUtils.replaceFragment(getFragmentManager(), fragment, R.id.main);
Eliasz Kubala
la source
6
Obsolète où? Je ne vois rien dans la documentation ou dans la source FragmentTransaction.
Rup
3
Attention, si vous disallowAddToBackStack, tous les futurs appels à addToBackStack lèveront IllegalStateException. Si addToBackStack a déjà été appelé, cette méthode lèvera IllegalStateException.
Kathir