J'utilise le nouveau composant d'architecture de navigation dans Android et je suis bloqué dans l'effacement de la pile de navigation après avoir migré vers un nouveau fragment.
Exemple: je suis dans le loginFragment et je veux que ce fragment soit effacé de la pile lorsque je navigue vers le fragment d'accueil afin que l'utilisateur ne soit pas renvoyé au loginFragment lorsqu'il appuie sur le bouton Précédent.
J'utilise un simple NavHostFragment.findNavController (Fragment) .navigate (R.id.homeFragment) pour naviguer.
Code actuel:
mAuth.signInWithCredential(credential)
.addOnCompleteListener(getActivity(), new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment);
} else {
Log.w(TAG, "signInWithCredential:failure", task.getException());
}
}
});
J'ai essayé d'utiliser les options de navigation dans le navigateur () , mais le bouton de retour me renvoie toujours à la connexionFragment
NavOptions.Builder navBuilder = new NavOptions.Builder();
NavOptions navOptions = navBuilder.setPopUpTo(R.id.homeFragment, false).build();
NavHostFragment.findNavController(LoginFragment.this).navigate(R.id.homeFragment, null, navOptions);
android
android-fragments
android-architecture-components
android-architecture-navigation
Youssef El Behi
la source
la source
popBackStack
ou ne pas ajouterLoginFragment
à backstack fournirnull
àaddToBackStack(null);
la remplacer par une nouvelleFragment
navigate()
méthode commenavigate(int resId, Bundle args, NavOptions navOptions)
et fournir celleNavOptions
qui correspond le mieux à votre senarioRéponses:
Tout d'abord, ajoutez des attributs
app:popUpTo='your_nav_graph_id'
etapp:popUpToInclusive="true"
à la balise d'action.Deuxièmement, accédez à la destination, en utilisant l'action ci-dessus comme paramètre.
Consultez la documentation pour plus d'informations.
REMARQUE : si vous naviguez en utilisant la méthode
navigate(@IdRes int resId)
, vous n'obtiendrez pas le résultat souhaité. Par conséquent, j'ai utilisé la méthodenavigate(@NonNull NavDirections directions)
.la source
findNavController(fragment).navigate(R.id.action_signInFragment_to_usersFragment)
Je pense que votre question concerne spécifiquement la façon d'utiliser le Comportement Pop / Pop To / app: popUpTo (en xml)
Dans la documentation,
Pop up vers une destination donnée avant de naviguer. Cela fait apparaître toutes les destinations non correspondantes de la pile arrière jusqu'à ce que cette destination soit trouvée.
Exemple (application de recherche d'emploi simple)
mon graphique start_screen_nav est comme ceci:
si je veux naviguer
EmployerMainFragment
et afficher tout y compris,startScreenFragment
le code sera:si je veux naviguer
EmployerMainFragment
et afficher tout sauf,startScreenFragment
le code sera:si je veux naviguer
EmployerMainFragment
et faire apparaîtreloginFragment
mais pas,startScreenFragment
le code sera:OU
la source
Dans mon cas, j'avais besoin de tout supprimer dans la pile arrière avant d'ouvrir un nouveau fragment, j'ai donc utilisé ce code
la première ligne supprime la pile arrière jusqu'à ce qu'elle atteigne le fragment spécifié dans mon cas, c'est le fragment d'origine, donc elle supprime complètement toute la pile arrière, et lorsque l'utilisateur clique à nouveau dans la société fragment_company, il ferme l'application.
la source
fragment_apps
??REMARQUE: tâche Clear est obsolète, la description officielle est
Ancienne réponse
Si vous ne voulez pas passer par tout ce qui fuzz dans le code, vous pouvez simplement vérifier
Clear Task
dansLaunch Options
les propriétés de l'action.Modifier: à partir d'Android Studio 3.2 Beta 5, Effacer la tâche n'est plus visible dans la fenêtre Options de lancement, mais vous pouvez toujours l'utiliser dans le code XML de la navigation, dans la balise d' action , en ajoutant
la source
Je le comprends enfin grâce à Comment désactiver UP dans la navigation pour un fragment avec le nouveau composant d'architecture de navigation?
J'ai dû spécifier .setClearTask (true) comme NavOption.
la source
navigate(int resId, Bundle args, NavOptions navOptions)
etNavOptions
val navOptions = NavOptions.Builder().setPopUpTo(R.id.my_current_frag, true).build()
findNavController().navigate(R.id.my_next_frag, null, navOptions)
R.id.my_next_frag
pourrait ressembler à un écran de connexion ou de démarrage); aussi si vous voulez popBack un seul, vous pouvez utiliser:NavHostFragment.findNavController(this).popBackStack()
.Voici comment j'y parviens.
la source
false
?inclusive boolean: true to also pop the given destination from the back stack
Donc, j'ai défini l'inclusif sur false car je ne veux pas sortir le fragment actuel de la pile.la source
Vous pouvez remplacer la pression arrière de l'activité de base comme ceci:
la source
Remarque: cela peut ne pas être lié à la question réelle.
Cette approche sera utile si une seule instance d'un fragment est nécessaire pour la maintenance dans Navigation .
Ici,
navOptions
est DSL et doit être importé. Au moment de cette réponse, j'utilise les versions gradées suivantes de l' interface utilisateur de navigation .la source
J'ai lutté pendant un moment pour empêcher le bouton de retour de revenir à mon fragment de départ, qui dans mon cas était un message d'introduction qui ne devrait apparaître qu'une seule fois.
La solution simple était de créer une action globale pointant vers la destination sur laquelle l'utilisateur doit rester. Vous devez définir
app:popUpTo="..."
correctement - réglez-le sur la destination que vous souhaitez faire sauter. Dans mon cas, c'était mon message d'introduction. Définir égalementapp:popUpToInclusive="true"
la source
Je peux expliquer cela par un petit exemple. J'ai deux fragments de liste d'employés et je supprime l'employé. Dans supprimer un employé, j'ai deux événements de clic pour annuler et supprimer. Si je clique sur Annuler, il suffit de revenir à l'écran de la liste des employés et si je clique sur Supprimer, je veux effacer toutes les piles de dos précédentes et aller à l'écran de la liste des employés.
Pour aller à l'écran précédent:
Pour effacer tous les backstack précédents et aller au nouvel écran:
Pour plus de références: Exemple de navigation Jetpack
la source
Vous pouvez faire aussi simple que:
Si vous voulez vérifier le décompte, vous pouvez faire comme:
la source