首页 文章

Android Jetpack Navigation如何处理Toolbar和BottomNavBar内容

提问于
浏览
2

我对导航组件如何适应应用程序行为感到困惑 . 在教程中看起来很漂亮和闪亮,你不会做太复杂的事情,但在实际的应用程序中实现时,事情似乎有所不同 .

Before Navigation

在实现导航之前,我不得不手动运行片段事务 . 为了做到这一点,我的片段将实现一个接口 onFragmentAction ,它将 bundle 传递给主 Activity ,并在基于动作的活动中,将当前片段替换为另一个片段 .

需要处理的第二部分是顶部工具栏和 BottomAppBar . 例如 BottomAppBar 需要 FAB 在某些片段上以不同方式对齐或在其他片段中隐藏 . 顶部 ToolBar 也需要在某些地方扩展或在其他地方崩溃 . 为此,我听了 FragmentManager.OnBackStackChangedListener 并基于片段标签 getSupportFragmentManager().getBackStackEntryAt(size - 1).getName() 相应地更改了布局 .

With Navigation

第一部分似乎很容易做到:传递参数并开始新的碎片 . 但我不知道导航是否可以处理工具栏管理,或者我需要继续从我的Activity管理它 .

2 回答

  • 2

    工具栏 Headers 是根据导航图中的“标签”值设置的,如果您想要使用工具栏或BottomAppBar执行不同的操作,可以在活动中添加addOnNavigatedListener,并根据当前目标执行某些操作 .

    findNavController(nav_host_fragment).addOnNavigatedListener { controller, 
     destination ->
     when(destination.id) {
        R.id.destination1 -> {
            //Do something with your toolbar or BottomAppBar
        }
        R.id.destination2 -> {
            //Do something with your toolbar or BottomAppBar
        }
    
     }
    }
    
  • 1

    即使Alex的解决方案有效,我也不建议将其用于管理工具栏 .

    工具栏应该是片段布局的一部分,每个片段应该管理自己的工具栏 . 你可以为每个片段充气不同的菜单 . 即使在想要在活动中使用工具栏的情况下,我建议获得对工具栏表单活动的引用(通过接口),然后在片段本身中添加和操作其项目 .

    这将解耦您的活动和片段(这是导航图和路由器的目标之一) . 一个好的经验法则是想象你想删除片段,那么你就不需要对活动做任何改变 .

相关问题