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

时间:2018-08-21 19:20:26

标签: android android-fragments kotlin android-bottom-nav-view android-architecture-navigation

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

5 个答案:

答案 0 :(得分:16)

更新(导航组件1.0)

Navigation component 1.0.0-alpha08开始,方法addOnNavigatedListener(controller: NavController, destination: NavDestination)已更改为addOnDestinationChangedListener(controller: NavController, destination: NavDestination, arguments: Bundle)。其行为也略有变化(如果destinations参数更改,也将调用它。)

旧答案

您可以使用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
    }
}

答案 1 :(得分:3)

使用addOnDestinationChangedListener可以正常工作,这是官方文档中建议的解决方案,但是由于在片段附加之前执行了回调,因此确实会引起闪烁。

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

input BookmarkInput {
  vidId: String!
  timestamp: Int!
}

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

您只需要在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
           }


        }

    }

从android开发人员文档中获取更多详细信息: Update UI components with NavigationUI

答案 4 :(得分:0)

因此,即使已经回答了这个问题,并且可以接受的答案也是可行的,但以下是实际实现此行为的代码:

MainActivity

fun hideBottomNav() {
   bottomNavigationView.visibility = View.GONE
}
    
fun showBottomNav() {
    bottomNavigationView.visibility = View.VISIBLE
}

然后,您调用片段onViewCreated()onDetach()函数中的函数,例如:

片段

class FragmentWithOutBottomNav() : Fragment() {
    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
        (activity as MainActivity).hideBottomNav()
    }

    override fun onDetach() {
        super.onDetach()
        (activity as MainActivity).showBottomNav()
    }
}

希望我能帮助一些人。编码愉快!