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.