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.
5 Réponses :
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.
Je pense que cela devrait faire l'affaire.
NavController controller = Navigation.findNavController(view); controller.popBackStack(R.id.fragmentLogin, true); controller.navigate(homeDestination)
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!
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"/>
Essayez ceci
val c = view.findNavController() c.popBackStack() // current fragment will be pop up from the stack c.navigate(DestinationFragmentID)
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 .
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.