我已经在这个主题上搜索了一段时间了,但没有任何成功。自从上次更新导航组件2.5.0与BottomNavigationView
的组合后,导航控制器保留了BottomNavView
每个标签的堆栈状态。
现在,我想知道是否有任何方法可以将graph
或某些fragments
排除在此规则之外?
更多详情:
- 我有1个
activity
,其余的都是fragments
- 我有带4个选项卡的
BottomNavigationView
- 设置导航控制器
- 每个选项卡都启动一个单独的
graph
(没有混淆)-看起来很干净,尤其是在一个较大的应用程序中 - 除此之外,我在工具栏上有2个图标(比如说
help
和settings
) - 这两个图标是Global Actions,因为它们是从活动而不是从片段开始的,并且几乎可以从任何点访问
为什么我想从这个规则中排除一些片段(help
和settings
)以保留它们的状态?因为导航到其中一个片段,然后来回更改BottomNavigationView
选项卡,我可能会在所有4个选项卡(或4个主图形)上都有这些片段
我都试过什么?
1.将settings
和faq
添加到BottomNavigationView
但不可见,并将全局操作链接到该选项卡(手动设置BottomNavView
的当前项)的棘手解决方案失败,因为我在BNV
中结束了6个项,这将导致崩溃,因为超过5个项是设计问题。
1.我尝试使用两个控制器来完成这个活动,一个用来连接BNV
,另一个用来处理全局操作,当然我最后还是有点混乱。
也许我对Android
的要求太高了,但是我希望能够在2.5.0
中为Navigation
添加这个默认行为,同时写一些例外。我不介意手动处理每个BNV
选项卡的导航,但是我的问题是global actions
。
如有任何建议,我们将不胜感激。
1条答案
按热度按时间tf7tbtn21#
现在,我想问的是,是否有任何方法可以将一个图或一些片段排除在这个规则之外?
通过使用
setupWithNavController
的重载并将saveState
设置为false,您 * 可以 * 将整个NavigationBarView
从状态保存中排除。但是,您 * 不能 * 根据需要排除某些片段/路由。就NavigationUI
而言,它要么是全部,要么是没有。在我看来,你有三个可行的选择:
NavigationUI
source以实现排除NavHostFragment
,如第二次尝试所示help
或settings
片段处于活动状态时,防止用户导航到另一个选项卡(是否隐藏带有NavController#addOnDestinationChangedListener
的BNV?)我认为第二种选择是目前为止最理想的选择,因为从定义应用行为的方式来看,它在层次结构上也是有意义的:全局操作不需要耦合到BNV选项卡。
This answer很好地演示了如何获取
NavController
引用。实际上,一旦你掌握了NavController
需要做什么,使用它并不是太糟糕。事实上,它可以说是你所能选择的最不笨拙的设计。