J'essaie de créer une seule activité Android. J'ai MainActivity (seule activité) avec BottomNavigationView, trois fragments de niveau supérieur et quelques fragments enfants. Mon exigence est chaque fois que l'écran affiche le niveau supérieur fragments, la navigation inférieure doit être visible de manière à ce que la commutation soit possible. Mais lorsque je visualise l'un des fragments enfants, la navigation inférieure doit être masquée. Existe-t-il un moyen standard d'utiliser le composant Navigation ou devez changer la visibilité manuellement ?
L'utilisation de addOnDestinationChangedListener fonctionne, et c'est la solution recommandée dans la documentation officielle, mais cela provoque un certain scintillement, car le rappel est exécuté avant que le fragment ne soit attaché.
Je trouve la réponse ci-dessous plus flexible et gère mieux les animations:
supportFragmentManager.registerFragmentLifecycleCallbacks(object : FragmentManager.FragmentLifecycleCallbacks() {
override fun onFragmentViewCreated(fm: FragmentManager, f: Fragment, v: View, savedInstanceState: Bundle?) {
TransitionManager.beginDelayedTransition(binding.root, Slide(Gravity.BOTTOM).excludeTarget(R.id.nav_Host_fragment, true))
when (f) {
is ModalFragment -> {
binding.bottomNavigation.visibility = View.GONE
}
else -> {
binding.bottomNavigation.visibility = View.VISIBLE
}
}
}
}, true)
Vous pouvez le personnaliser en fonction des transitions entre vos fragments, en choisissant une animation différente (dans mon exemple, c'est une diapositive), ou en effectuant l'appel à un autre rappel du cycle de vie.
il vous suffit d'écrire ce code dans MainActivity
class MainActivity : AppCompatActivity() {
private lateinit var navController: NavController
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//Getting the Navigation Controller
navController = Navigation.findNavController(this, R.id.fragment)
//Setting the navigation controller to Bottom Nav
bottomNav.setupWithNavController(navController)
//Setting up the action bar
NavigationUI.setupActionBarWithNavController(this, navController)
//setting the Bottom navigation visibiliy
navController.addOnDestinationChangedListener { _, destination, _ ->
if(destination.id == R.id.full_screen_destination ){
bottomNav.visibility = View.GONE
}else{
bottomNav.visibility = View.VISIBLE
}
}
}
obtenir plus de détails dans la documentation du développeur Android Android: Mettre à jour les composants de l'interface utilisateur avec NavigationUI