隐藏子屏幕/片段的android底部导航视图

Sub*_*haw 9 android android-fragments kotlin android-bottom-nav-view android-architecture-navigation

我正在尝试创建单个活动Android应用程序.我有使用BottomNavigationView的MainActivity(仅活动),三个顶级片段和一些子片段.我的要求是每当屏幕显示顶级片段时,底部导航应该是可见的,以便可以进行切换.但是当我查看任何子片段时,应隐藏底部导航.是否有任何使用导航组件的开箱即用方式或需要手动更改可见性?

art*_*est 24

您可以使用NavController.OnNavigatedListener来实现此行为(在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
    }
}
Run Code Online (Sandbox Code Playgroud)

  • `addOnNavigatedListener` 更改为 `addOnDestinationChangedListener` (2认同)

小智 6

使用 addOnDestinationChangedListener 有效,这是官方文档中推荐的解决方案,但它确实会导致一些闪烁,因为在附加片段之前执行回调。

我发现以下答案更灵活,并且可以更好地处理动画:

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)
Run Code Online (Sandbox Code Playgroud)

您可以根据片段之间的转换,通过选择不同的动画(在我的示例中是幻灯片)或通过在另一个生命周期回调中进行调用来自定义它。


Ank*_*dar 4

您必须在 MainActivity 中创建一个方法以获得可见性。请从要显示或隐藏的片段中调用该方法。

我遇到这种情况的一件事是,底部导航可见性没有正确消失。因此,我将底部导航视图放在相对布局中并隐藏该父视图。