5
votes

Est-il possible de changer l'icône du bouton vers le haut dans le composant de navigation?

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 .


0 commentaires

3 Réponses :


6
votes

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.


0 commentaires

0
votes

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)
        }
}


0 commentaires

0
votes

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
    )
}


0 commentaires