web-dev-qa-db-fra.com

Comment gérer le bouton de retour à la destination de départ du composant de navigation

J'ai commencé à travailler avec le nouveau composant de navigation et je suis vraiment en train de le creuser! J'ai un problème cependant - comment suis-je censé gérer le bouton de retour lorsque je suis à la destination de départ du graphique?

Voici le code que j'utilise maintenant:

findNavController(this, R.id.my_nav_Host_fragment)
                .navigateUp()

Lorsque je suis n'importe où sur mon graphique, cela fonctionne très bien, il me renvoie, mais quand je suis au début, l'application se bloque car le backstack est vide.

Tout cela a du sens pour moi, je ne sais pas comment le gérer.

Bien que je puisse vérifier si l'ID du fragment actuel est le même que celui que je connais pour être la racine du graphique, je cherche une solution plus élégante comme un drapeau booléen de savoir si l'emplacement actuel dans le graphique est l'emplacement de départ ou non.

Des idées?

7
MichaelThePotato

Vous ne devez pas remplacer "onBackPressed", vous devez remplacer "onSupportNavigateUp" et y mettre

findNavController(this, R.id.my_nav_Host_fragment)
            .navigateUp()

À partir de la documentation officielle: Vous allez également remplacer AppCompatActivity.onSupportNavigateUp () et appeler NavController.navigateUp

https://developer.Android.com/topic/libraries/architecture/navigation/navigation-implementing

6
Alex

J'ai eu un scénario similaire où je voulais terminer l'activité lorsque j'étais à la destination de départ et faire une "navigation vers le haut" régulière lorsque j'étais plus bas dans le graphique de navigation. J'ai résolu cela grâce à une simple fonction d'extension:

fun NavController.navigateUpOrFinish(activity: AppCompatActivity): Boolean {
return if (navigateUp()) {
    true
} else {
    activity.finish()
    true
}

}

Et puis appelez-le comme:

override fun onSupportNavigateUp() = 
        findNavController(R.id.nav_fragment).navigateUpOrFinish(this)

Cependant, je n'ai pas pu utiliser NavigationUI car cela masquerait la flèche de retour chaque fois que j'étais à la destination de départ. Donc au lieu de:

NavigationUI.setupActionBarWithNavController(this, controller)

J'ai contrôlé manuellement l'icône d'accueil:

setSupportActionBar(toolbar)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_navigation_back)
5
John van den Berg

Remplacez onBackPressed dans votre activité et vérifiez si la destination actuelle est la destination de départ ou non.

En pratique, cela ressemble à ceci:

@Override
public void onBackPressed() {
    if (Navigation.findNavController(this,R.id.nav_Host_fragment)
            .getCurrentDestination().getId() == R.id.your_start_destination) {
        // handle back button the way you want here
        return;
    }
    super.onBackPressed();
}
3
Shynline

Comme mon bouton de retour fonctionne correctement, et l'utilisation de NavController.navigateUp () s'est bloquée sur le bouton de retour de la destination de départ. J'ai changé ce code en quelque chose comme ça. Une autre possibilité sera de simplement vérifier si currentDestination == startDestination.id mais je veux fermer l'activité et revenir à une autre activité.

override fun onSupportNavigateUp() : Boolean {
        //return findNavController(R.id.wizard_nav_Host_fragment).navigateUp()
        onBackPressed()
        return true
    }
0
Michał Ziobro

Si vous voulez dire le début de votre graphique de navigation "racine" (au cas où vous avez des graphiques de navigation imbriqués), vous ne devriez pas du tout afficher un bouton vers le haut, du moins selon les principes de navigation .

0
Mike Scamell