Je voudrais changer l'icône du bouton vers le haut dans ActionBar qui fonctionne avec le composant de navigation. J'ai essayé plusieurs options comme:
setupWithNavController(toolbar, navController)
dans MainAcitivty
ou
supportActionBar?.setDisplayShowTitleEnabled(false)
dans Toolbar .xml et rien ne semble fonctionner.
J'ai une configuration assez standard avec
supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_arrow_left_blue_24dp)
appelée dans MainActivity: onCreate .
Je m'attendrais à ce que
setSupportActionBar(appToolbar.toolbar) setupActionBarWithNavController(this, navController)
fonctionne, car par exemple la désactivation du titre pour ActionBar
en appelant :
app:navigationIcon="@drawable/ic_arrow_left_blue_24dp"
fonctionne comme prévu et le titre n'est pas défini sur le nom Fragment
lors de la navigation.
De plus, j'ai enquêté un peu et dans ActionBarOnDestinationChangedListener
il y a un appel à setNavigationIcon
qui définit une icône sur DrawerArrowDrawable code>, ce qui est un peu bizarre car je n'utilise pas
Drawer
dans ma configuration.
Le passage à:
supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_arrow_left_blue_24dp)
ne fonctionne pas car ToolbarOnDestinationChangedListener
utilise également le même DrawerArrowDrawable
.
3 Réponses :
J'ai trouvé une réponse. J'ai vérifié le suivi des problèmes pour le composant de navigation et il semble pour l'instant impossible de le modifier sans solution de contournement:
https://issuetracker.google.com/u/1/issues/121078028
Heureusement, c'est toujours possible, il suffit de mettre en œuvre OnDestinationChangedListener
et changez l'icône ici comme elle est appelée après setNavigationIcon
dans AbstractAppBarOnDestinationChangedListener
. Voici un code:
navController.addOnDestinationChangedListener { _, _, _ -> supportActionBar?.setHomeAsUpIndicator(R.drawable.ic_arrow_left_blue_24dp) }
Vous pouvez même différer l'icône pour différentes destinations.
C'est une solution temporaire car cette fonctionnalité n'est pas encore là. J'utilise la version 1.0.0-alpha09
du composant de navigation.
Si vous n'utilisez pas de supportActionBar
mais que vous utilisez votre propre barre d'outils à la place, la solution est la suivante.
navController.addOnDestinationChangedListener { _, destination, _ -> if (destination.id == R.id.myDestination) { myToolbar.setNavigationIcon(R.drawable.myIcon) } }
Vous pouvez implémenter NavigationController.OnDestinationChangedListener
et utiliser la méthode Toolbar.setNavigationIcon
pour définir l'icône. Je recommanderais d'utiliser AppBarConfiguration.topLevelDestinations
pour déterminer si votre destination est une destination de premier niveau et définir vos icônes en conséquence. Kotlin
Exemple:
navController.addOnDestinationChangedListener { _, destination, _ -> val isTopLevelDestination = appBarConfiguration.topLevelDestinations.contains(destination.id) toolbar.setNavigationIcon( if(isTopLevelDestination) R.drawable.ic_menu else R.drawable.ic_back ) }