web-dev-qa-db-fra.com

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

J'ai un code client. Il n’existe qu’une seule activité pour tous les fragments, c’est-à-dire que l’activité unique consiste à gérer tous les fragments.

Cette activité contient le code suivant pour tout fragment situé à 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) suivie d'un commit()?

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

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

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

72
My God

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

Citation de documents:

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

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 sous la forme d'une transaction unique et du bouton Précédent va les inverser tous ensemble.

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

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

Donc, vous devez vous engager à la fin.

Pourquoi devez-vous passer un paramètre null à addToBackStack?

Il n'est pas nécessaire que ce soit null, cela peut être une chaîne. Si vous ne voulez pas, il suffit de passer null.

public abstract FragmentTransaction addToBackStack (Nom de chaîne)

Ajouté dans l'API de niveau 11 Ajoutez cette transaction à la pile arrière. Cela signifie que la transaction sera mémorisée une fois qu'elle est validée et inversera son opération lorsqu'elle sera extraite ultérieurement de la pile.

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

Concernant:

On dirait que ce code est inutile car je l'ai exécuté sans la dernière ligne .addToBackStack (null) .commit () et il s'est exécuté sans problème

Si vous voulez naviguer au fragment précédent, ajoutez-le à backstack. Donc, cela dépend si vous voulez ajouter le fragment au backstack.

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

Vous avez déjà l'instance de fragment firstFragment. Donc, je ne sais pas ce que vous entendez par récupérer 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)

89
Raghunandan

La chaîne tag de addToBackStack(String name) permet de localiser la pile arrière pour la placer ultérieurement directement à cet emplacement. Cela signifiait être utilisé dans la méthode popToBackStack(String name, int flags):

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

name: Si non-null, il s'agit du nom d'un précédent état d'arrière-plan à rechercher; si trouvé, tous les états jusqu'à cet état seront sautés. L'indicateur POP_BACK_STACK_INCLUSIVE peut être utilisé pour contrôler si l'état nommé lui-même est sauté. Si la valeur est null, seul l'état le plus élevé est affiché.

flags: 0 ou POP_BACK_STACK_INCLUSIVE.

En d'autres termes, votre pile de mémoire sera effacée jusqu'à ce qu'elle trouve le fragment ajouté par le name dans addToBackStack(String name).

Par exemple, si vous effectuez une série d’additions ou de remplacements dans le gestionnaire de fragments en donnant les noms "frag1", "frag2", "frag3", "frag4" et que vous souhaitez par la suite revenir directement au fragment 2 ajouté avec addToBackStack (" frag2 "), vous appelez popToBackStack("frag2", 0).

Alors,

  • Utilisez .addToBackStack("fragName"): si vous souhaitez utiliser plus tard popToBackStack(String name, int flags) pour extraire plus d'une pile arrière.

  • Use .addToBackStack(null): Si vous ne souhaitez pas extraire ultérieurement plus d'une pile en arrière, mais souhaitez quand même en extraire une à la fois. Faites cela même si vous n'appelez pas explicitement popToBackStack () mais laissez l’implémentation par défaut de la presse arrière gérer la pile arrière.

  • Use .disallowAddToBackStack(): Si vous ne voulez ni appuyer sur la touche arrière ni appeler popBackStack () explicitement. Il s'assurera qu'aucune partie du code n'utilise .addToBackStack ().

6
Allan Veloso

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 mignon exemple d'utilisation:

GameFragment fragment = GameFragment.newInstance(mGameObject, currentQuestion);
ActivityUtils.replaceFragment(getFragmentManager(), fragment, R.id.main);
2
EliaszKubala