web-dev-qa-db-fra.com

Supprimer le bouton vers le haut de la barre d'action lors de la navigation à l'aide de BottomNavigationView avec Android Bibliothèque d'interface de navigation

J'ai créé une petite application qui a trois fragments pour une navigation de haut niveau via un BottomNavigationView. Si vous lancez l'application et cliquez sur un bouton de navigation dans la navigation inférieure, vous êtes présenté avec un bouton haut dans la barre d'action. Voici le code de l'activité:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.main_activity)

        setSupportActionBar(toolbar)

        val navController = navHostFragment.findNavController()
        setupActionBarWithNavController(this, navController)
        setupWithNavController(bottomNav, navController)
    }

    override fun onSupportNavigateUp(): Boolean
            = findNavController(navHostFragment).navigateUp()

}

Voici une capture d'écran du résultat. L'application est lancée sur l'écran d'accueil et tout ce que j'ai fait est simplement de cliquer sur le bouton de profil de BottomNavigationView.

enter image description here

J'ai essayé d'écouter les sélections d'articles de BottomNavigationView et de naviguer manuellement en utilisant différents NavOptions en vain. Y a-t-il quelque chose que nous pouvons faire pour éviter d'afficher un bouton vers le haut dans la barre d'actions pendant que l'utilisateur navigue avec une BottomNavigationView?

18
jeffmcnd

À partir de 1.0.0-alpha07, vous pouvez utiliser AppBarConfiguration pour configurer ce comportement.

AppBarConfiguration a un constructeur Builder pour que vous puissiez créer un nouveau Builder avec un ensemble spécifique de destinations de premier niveau, référencé par leur id (ce id est le celui que vous avez défini sur votre disposition de navigation).

Créez un nouveau AppBarConfiguration:

val appBarConfiguration = AppBarConfiguration
            .Builder(
                    R.id.navigationHomeFragment,
                    R.id.navigationListFragment,
                    R.id.navigationProfileFragment)
            .build()

Ensuite, au lieu de setupActionBarWithNavController(this, navController) vous devez appeler setupActionBarWithNavController(this, navController, appBarConfiguration)

C'est la bonne façon de gérer les principaux comportements de navigation.

28
Javier Cancio

J'ai eu le même problème et j'ai trouvé un moyen d'obtenir le fragment actuel avec le NavController.addOnNavigatedListener , j'ai donc appliqué la logique suivante dans mon activité et pour maintenant ça marche pour moi

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_home)
    val navHost = supportFragmentManager
            .findFragmentById(R.id.navHostFragment) as NavHostFragment

    navHost.navController.addOnNavigatedListener { _, destination ->
        val showButton = showUpButton(destination.id)
        //Here occurs the magic
        supportActionBar?.setDisplayShowHomeEnabled(showButton)
        supportActionBar?.setDisplayHomeAsUpEnabled(showButton)
    }
}

//Check according to your convenience which fragment id
//should show or hide the "Up Button"
private fun showUpButton(id: Int): Boolean {
    return id != R.id.your_home_fragment && id != R.id.your_list_fragment 
            && id != R.id.your_profile_fragment
}

Et voici mon projet ...

enter image description here

Je ne sais pas si c'est la meilleure option mais si quelqu'un a une meilleure suggestion, ce sera le bienvenu

6
Julio Lemus

Utilisez ceci au lieu de setupWithNavController:

navController.addOnNavigatedListener(new NavController.OnNavigatedListener() {
     @Override
     public void onNavigated(@NonNull NavController controller, @NonNull NavDestination destination) {
         toolbar.setTitle(destination.getLabel());
     }
});

Ou l'équivalent en Kotlin.

La seule chose que setupWithNavController fait est d'ajouter un écouteur pour changer le titre de la barre d'outils et crée le bouton haut. Si vous ne voulez pas le bouton haut, ajoutez simplement un écouteur qui modifie uniquement le titre de la barre d'outils.

4
Bob bobbington

Si vous utilisez NavigationUI.setupWithNavControllerconsultez onNavDestinationSelected .

Dans votre vue de navigation inférieure menu.xml, ajouter Android:menuCategory="secondary" au MenuItem correspondant:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:Android="http://schemas.Android.com/apk/res/Android">

  <item
    Android:id="@+id/profileFragment"
    Android:icon="@drawable/bottom_nav_icon_profile"
    Android:menuCategory="secondary"
    Android:title="@string/profile" />
1
CHAN