Hide android bottom navigation view for child screens/ fragments Hide android bottom navigation view for child screens/ fragments android android

Hide android bottom navigation view for child screens/ fragments


Update (Navigation component 1.0)

As of Navigation component 1.0.0-alpha08, method addOnNavigatedListener(controller: NavController, destination: NavDestination) was changed to addOnDestinationChangedListener(controller: NavController, destination: NavDestination, arguments: Bundle). Its behavior was also slightly changed (it is also called if the destinations arguments change).

Old Answer

You can use NavController.OnNavigatedListener to achieve this behavior (set it in Activity onCreate):

findNavController(R.id.container).addOnNavigatedListener { _, destination ->    when (destination.id) {        R.id.dashboardFragment -> showBottomNavigation()        else -> hideBottomNavigation()    }}private fun hideBottomNavigation() {    // bottom_navigation is BottomNavigationView    with(bottom_navigation) {        if (visibility == View.VISIBLE && alpha == 1f) {            animate()                    .alpha(0f)                    .withEndAction { visibility = View.GONE }                    .duration = EXIT_DURATION        }    }}private fun showBottomNavigation() {    // bottom_navigation is BottomNavigationView    with(bottom_navigation) {        visibility = View.VISIBLE        animate()                .alpha(1f)                .duration = ENTER_DURATION    }}


Using addOnDestinationChangedListener works, and it's the solution recommended in the official documentation, but it does cause some flickering, as the callback is executed before the fragment is attached.

I find the below answer more flexible, and handles animations better:

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)

You can customize it depending on the transitions between your fragments, by choosing different animation (on my example it's a Slide), or by making the call at another lifecycle callback.


You have to make a method in MainActivity for visibility. Do call that method from fragments where you want to show or hide.

One thing I faced with such scenario is, bottom navigation visibility is not being properly gone. So I put bottom navigation view in Relative layout and hide that parent view.