在我的应用程序中,我有一个主屏幕,其中包含来自Material design的BottomNavigation
。从这些屏幕中,我希望能够从BottomNavigation
隐藏的其他片段开始,以便新片段充满整个屏幕。然后应该可以通过后退箭头返回。我想大家都可以想象得到,因为这是当今非常普遍的模式。
要实现此目的,我想将navigation component与单个活动设计一起使用。我的主意是我的MainActivity仅持有一个NavHostFragment
,而一个BottomNavFragment持有另一个NavHostFragment
和BottomNavigation
。由于隐藏的可能性,我无法移动
BottomNavigation
到MainActivity布局。
这对我来说似乎有些奇怪。为此,我真的需要两个导航图和两个NavHostFragments
吗? BottomNavFragment中的NavHostFragment
仅用于显示与BottomNavigation
关联的相关片段。要导航到其他片段,我必须使用“活动”中的NavHostFragment
。如果我使用相同的导航图,它将与开始导航发生冲突,并因此导致无限递归。
或者我应该对要启动的其他片段使用全屏DialogFragments
吗?如果是这样,我如何告诉导航组件以全屏对话框形式启动对话框?是否有推荐的方法可以让Google执行此操作?
答案 0 :(得分:5)
Google建议使用NavController
监听OnDestinationChangedListener
当前的目的地,并根据要求更新ui。 Look here
答案 1 :(得分:0)
我不知道这是否有帮助,但是我花了几个小时来解决这个问题。那时没有太多帮助。
How to use NavigationExtensions.kt in a Java project?
我在底部导航中的每个选项卡上都使用一个Navhostfragment和多个图形。如果您需要更多说明,我们很乐意为您提供帮助。
答案 2 :(得分:0)
NavHostFragment
基本上是通过ChildFragmentManager
创建一个带有自己的后堆栈的片段,这使得处理后堆栈更加容易。
如果您曾经尝试过,甚至还没有一种合适的解决方案来处理 Stackoverflow 中ChildFragmentManager
的嵌套片段中的堆栈,或者我找不到,则可以通过初始父项分段给子进程,并在调用子分段的onDestroy等时删除事务,这里是一个link进行签出。我什至看到他们使用反射来解决它。
长话短说,这很难。 NavHostFragment
很简单,NavController
也很容易找到起始目的地,例如属性的当前目的地。
如果希望每个选项卡都有向后导航,则还需要与导航标签一样多的NavHostFragments,还需要将它们与ViewPager2
一起使用以嵌套导航。
我看到NavHostFragment仅有一个问题,就是您无法使用NavHostFragment
创建NavHostFragment.create
,这是我的question,当您需要带有自定义属性(例如, ViewModel或DynamicNavHostFragment创建。
BottomNavigationView扩展还存在另一个问题,Google会在BottomNavigationView本身位于片段内部并替换该片段时将其泄漏。我打算为FragmentManager写另一个扩展来解决问题。
我创建了一个tutorial来玩NavHostFragments,NavController,ViewPager2,BottomNavigationView和内存泄漏以及如何解决它们。我仍在处理某些部分,目前正在修复文档。