web-dev-qa-db-fra.com

Désactiver l'ajout de fragment à backstack dans le composant Architecture de navigation

Supposons que j'ai 4 fragments: A, B, C, X et que je puisse naviguer entre eux de cette manière:

... -> A -> C -> X    and ... -> B -> C -> X

Mais quand je suis dans le fragment X, appelez mNavController.navigateUp() Je veux ignorer le fragment C et aller au fragment A ou B. Que dois-je faire?

UPD: J'ai besoin d'une solution uniquement pour le composant d'architecture de navigation https://developer.Android.com/topic/libraries/architecture/navigation/ Merci!

8
igor_rb

Donné R.id.fragmentC est le nom de la destination C, à partir de la destination X, vous pouvez effectuer les opérations suivantes:

NavController controller = Navigation.findNavController(view);
controller.popBackStack(R.id.fragmentC, true);

Cela devrait faire sortir toutes les destinations de la pile avant C, et laisser A ou B au-dessus de la pile.

15
bentesha

Vous pouvez également utiliser app:popUpTo et app:popUpToInclusive attributs dans la navigation xml ressource pour nettoyer automatiquement la pile arrière lors de l'exécution de certaines transactions, donc le bouton de sauvegarde/ramènera votre utilisateur au fragment racine.

<fragment
    Android:id="@+id/fragment1"
    Android:name="com.package.Fragment1"
    Android:label="Fragment 1">

    <action
        Android:id="@+id/action_fragment1_to_fragment2"
        app:destination="@id/fragment2"
        app:popUpTo="@id/fragment1"
        app:popUpToInclusive="true / false" />

</fragment>
9
Viacheslav

Comme mentionné par @bentesha, cela fonctionne de la manière suivante: les fragments seront éclatés jusqu'à fragmentC inclusivement.

Vous pouvez également y parvenir comme ci-dessous:

NavController controller = Navigation.findNavController(view);
controller.popBackStack(R.id.fragmentA, false);

OR

NavController controller = Navigation.findNavController(view);
controller.popBackStack(R.id.fragmentB, false);

Et cela apparaîtra exclusivement sur fragmentA/fragmentB, je pense que c'est la manière la plus descriptive pour vous et pour les autres de comprendre.

3
Muhammad Maqsood