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.
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?
À 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.
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 ...
Je ne sais pas si c'est la meilleure option mais si quelqu'un a une meilleure suggestion, ce sera le bienvenu
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.
Si vous utilisez NavigationUI.setupWithNavController
consultez 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" />