web-dev-qa-db-fra.com

Masquer Android vue de navigation inférieure pour les écrans / fragments enfants

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 ?

11
Subhojit Shaw

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.

0
Hicham

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

0
Amina Bekir