7
votes

Comment empêcher le fragment précédent de s'afficher après avoir appuyé sur le bouton Retour à l'aide du contrôleur de navigation?

J'essaye d'utiliser le contrôleur de navigation en ce moment. Je souhaite passer de LoginFragment à HomeFragment . Dans LoginFragment , j'utilise ce code ci-dessous pour passer à HomeFragment.

val intent = Intent(this,HomeActivity::class.java)
intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TASK.or(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)

Cependant, lorsque j'appuie sur le bouton retour dans le HomeFragment , il reviendra à LoginFragment , je m'attends à ce que lorsque j'appuie sur le bouton, il ferme l'application.

À l'ancienne, si j'utilise plutôt l'activité de l'utilisation de Fragment , je fais généralement quelque chose comme ceci pour obtenir le comportement attendu:

Navigation.findNavController(view).navigate(homeDestination)

En utilisant ces indicateurs, j'utilise pour obtenir le comportement attendu . Mais je ne sais pas comment implémenter le même comportement en utilisant le contrôleur de navigation.


4 commentaires

Lorsque vous essayez de créer un nouveau fragment à partir du précédent, utilisez remplacer à la place d'ajout. getSupportFragmentManager (). beginTransaction () .replace (R.id.container_between, policies, Policies.TAG) .addToBackStack (Policies.TAG) .commit ();


@Shane - vous n'utilisez pas directement FragmentTransactions lorsque vous utilisez Navigation .


@Shane J'utilise le composant de navigation Android et n'utilise plus la transaction de fragment developer.android .com / sujet / bibliothèques / architecture / navigatio‌ n /…


Notez que selon les Principes de navigation et les documentation de navigation conditionnelle , vous ne devriez pas utiliser de fragment de connexion pour commencer destination.


5 Réponses :


11
votes

Navigation propose des attributs popUpTo et popUpToInclusive pour supprimer des fragments de la pile arrière dans le cadre d'une opération navigate () .

Cela peut être défini soit en XML:

NavOptions navOptions = new NavOptions.Builder()
    .setPopUpTo(R.id.destination_to_pop, true)
    .build();
Navigation.findNavController(view).navigate(homeDestination, navOptions)

soit par programme:

<!-- Add to your Navigation XML, then use navigate(R.id.go_home) -->
<action
  android:id="@+id/go_home"
  app:destination="@+id/home_fragment"
  app:popUpTo="@+id/destination_to_pop"
  app:popUpToInclusive="true"/>

Vous pouvez également utiliser l'identifiant de un élément également.


0 commentaires

0
votes

Je pense que cela devrait faire l'affaire.

NavController controller = Navigation.findNavController(view);
controller.popBackStack(R.id.fragmentLogin, true);
controller.navigate(homeDestination)


2 commentaires

Bien que cela fonctionne d'une certaine manière, Navigation propose un attribut popUpTo intégré pour effectuer cette opération en une seule opération, sans envoyer de mises à jour à OnDestinationChangedListener pour cet état intermédiaire.


Ya. C'est la bonne idée. J'ai vu votre réponse plus tard, j'ai posté la mienne. Le vôtre est parfait. Gloire!



0
votes

Je suivais la réponse d'Ian mais j'avais eu de la malchance car je ne savais pas ce que serait le popUpTo.

Nous devons donc utiliser l'id Of nav Graph ici.

app: popUpTo = "@ + id / idOfNavGraph". // id du graphique de navigation

<action
  android:id="@+id/go_home"
  app:destination="@+id/home_fragment"
  app:popUpTo="@+id/idOfNavGraph". //id of nav graph
  app:popUpToInclusive="true"/>


0 commentaires

0
votes

Essayez ceci

 val c = view.findNavController()
 c.popBackStack() // current fragment will be pop up from the stack
 c.navigate(DestinationFragmentID)


0 commentaires

0
votes

Je suis évidemment en retard. Néanmoins, j'aimerais faire ma part et développer la réponse d'Ian. Dans app: popUpTo = "@ + id / destination_to_pop" le destination_to_pop signifie en réalité la destination que vous ne souhaitez pas conserver dans la pile arrière. Dans votre cas, loging_fragment .

De cette façon, lorsque vous revenez à partir de votre HomeFragment , l'application se fermera car LoginFragment ne se trouve plus dans la pile arrière. Vous pouvez trouver la documentation officielle correspondante ici .


0 commentaires