193 votes

java.lang.IllegalArgumentException: la destination de navigation xxx est inconnue de ce NavController

J'ai des problèmes avec le nouveau composant Android Navigation Architecture lorsque j'essaie de naviguer d' un fragment à un autre , j'obtiens cette erreur étrange:

 java.lang.IllegalArgumentException: navigation destination XXX
is unknown to this NavController
 

Toutes les autres navigations fonctionnent bien, sauf celle-ci.

J'utilise:

 findNavContoller()
 

fonction d'extension de Fragment pour accéder au navControler.

Toute aide serait appréciée.

104voto

ScootrNova Points 1259

Dans mon cas, si l'utilisateur clique sur le même point de vue, deux fois très très rapidement, cet accident va se produire. Si vous avez besoin de mettre en œuvre une sorte de logique pour éviter que plusieurs clics... ce Qui est très ennuyeux, mais il semble être nécessaire.

Vous pouvez en savoir plus sur la prévention de ce sujet ici: Android Prévention de la Double Clic Sur Un Bouton

Edit 3/19/2019: Juste pour clarifier un peu plus loin, cet accident n'est pas exclusivement reproductible par juste "en cliquant sur le même point de vue, deux fois très très vite". Alternativement, vous pouvez utiliser deux doigts et cliquez sur les deux (ou plus) en même temps, où chaque point de vue a leur propre navigation, qu'ils feraient. C'est surtout facile à faire quand vous avez une liste d'éléments. L'info ci-dessus sur de multiples cliquez sur la prévention va gérer ce cas.

86voto

theJian Points 449

Vérifiez currentDestination avant l'appel de naviguer pourrait être utile.

Par exemple, si vous avez deux fragment de destinations sur la navigation graphique fragmentA et fragmentB, et il n'y a qu'une seule action à partir d' fragmentA de fragmentB. appelant navigate(R.id.action_fragmentA_to_fragmentB) entraînera IllegalArgumentException quand vous étaient déjà sur fragmentB. À cet effet, vous devez toujours vérifier l' currentDestination avant la navigation.

if (navController.currentDestination?.id == R.id.fragmentA) {
    navController.navigate(R.id.action_fragmentA_to_fragmentB)
}

57voto

Alex Nuts Points 156

Vous pouvez vérifier l'action demandée dans la destination actuelle du contrôleur de navigation.

UPDATE a ajouté l'utilisation des actions globales pour une navigation sûre.

 fun NavController.navigateSafe(
        @IdRes resId: Int,
        args: Bundle? = null,
        navOptions: NavOptions? = null,
        navExtras: Navigator.Extras? = null
) {
    val action = currentDestination?.getAction(resId) ?: graph.getAction(resId)
    if (action != null && currentDestination?.id != action.destinationId) {
        navigate(resId, args, navOptions, navExtras)
    }
}
 

21voto

AntPachon Points 41

Cela peut également arriver si vous avez un fragment A avec un ViewPager de fragments B et que vous essayez de naviguer de B à C

Étant donné que dans le ViewPager, les fragments ne sont pas une destination de A, votre graphique ne saurait pas que vous êtes sur B.

Une solution peut être d'utiliser ADirections dans B pour naviguer vers C

12voto

Neil Points 1721

Dans mon cas, j'utilisais un bouton de retour personnalisé pour naviguer vers le haut. J'ai appelé onBackPressed() à la place du code suivant

 findNavController(R.id.navigation_host_fragment).navigateUp()
 

Cela a provoqué le IllegalArgumentException . Après l'avoir changé pour utiliser la méthode navigateUp() à la place, je n'ai plus eu de plantage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X