android-fragments 我们是否可以将特定片段从导航组件堆栈中排除?

xxls0lw8  于 2022-11-14  发布在  Android
关注(0)|答案(1)|浏览(127)

我已经在这个主题上搜索了一段时间了,但没有任何成功。自从上次更新导航组件2.5.0与BottomNavigationView的组合后,导航控制器保留了BottomNavView每个标签的堆栈状态。
现在,我想知道是否有任何方法可以将graph或某些fragments排除在此规则之外?
更多详情:

  • 我有1个activity,其余的都是fragments
  • 我有带4个选项卡的BottomNavigationView
  • 设置导航控制器
  • 每个选项卡都启动一个单独的graph(没有混淆)-看起来很干净,尤其是在一个较大的应用程序中
  • 除此之外,我在工具栏上有2个图标(比如说helpsettings
  • 这两个图标是Global Actions,因为它们是从活动而不是从片段开始的,并且几乎可以从任何点访问

为什么我想从这个规则中排除一些片段(helpsettings)以保留它们的状态?因为导航到其中一个片段,然后来回更改BottomNavigationView选项卡,我可能会在所有4个选项卡(或4个主图形)上都有这些片段
我都试过什么?
1.将settingsfaq添加到BottomNavigationView但不可见,并将全局操作链接到该选项卡(手动设置BottomNavView的当前项)的棘手解决方案失败,因为我在BNV中结束了6个项,这将导致崩溃,因为超过5个项是设计问题。
1.我尝试使用两个控制器来完成这个活动,一个用来连接BNV,另一个用来处理全局操作,当然我最后还是有点混乱。
也许我对Android的要求太高了,但是我希望能够在2.5.0中为Navigation添加这个默认行为,同时写一些例外。我不介意手动处理每个BNV选项卡的导航,但是我的问题是global actions
如有任何建议,我们将不胜感激。

tf7tbtn2

tf7tbtn21#

现在,我想问的是,是否有任何方法可以将一个图或一些片段排除在这个规则之外?
通过使用setupWithNavController的重载并将saveState设置为false,您 * 可以 * 将整个NavigationBarView从状态保存中排除。但是,您 * 不能 * 根据需要排除某些片段/路由。就NavigationUI而言,它要么是全部,要么是没有。
在我看来,你有三个可行的选择:

  • 在本地修改NavigationUI source以实现排除
  • 使用嵌套的NavHostFragment,如第二次尝试所示
  • helpsettings片段处于活动状态时,防止用户导航到另一个选项卡(是否隐藏带有NavController#addOnDestinationChangedListener的BNV?)

我认为第二种选择是目前为止最理想的选择,因为从定义应用行为的方式来看,它在层次结构上也是有意义的:全局操作不需要耦合到BNV选项卡。
This answer很好地演示了如何获取NavController引用。实际上,一旦你掌握了NavController需要做什么,使用它并不是太糟糕。事实上,它可以说是你所能选择的最不笨拙的设计。

相关问题