带有导航组件的片段中的BottomNavigation

时间:2020-04-25 09:43:02

标签: android android-fragments android-architecture-navigation android-bottomnav

在我的应用程序中,我有一个主屏幕,其中包含来自Material design的BottomNavigation。从这些屏幕中,我希望能够从BottomNavigation隐藏的其他片段开始,以便新片段充满整个屏幕。然后应该可以通过后退箭头返回。我想大家都可以想象得到,因为这是当今非常普遍的模式。

要实现此目的,我想将navigation component与单个活动设计一起使用。我的主意是我的MainActivity仅持有一个NavHostFragment,而一个BottomNavFragment持有另一个NavHostFragmentBottomNavigation。由于隐藏的可能性,我无法移动 BottomNavigation到MainActivity布局。

这对我来说似乎有些奇怪。为此,我真的需要两个导航图和两个NavHostFragments吗? BottomNavFragment中的NavHostFragment仅用于显示与BottomNavigation关联的相关片段。要导航到其他片段,我必须使用“活动”中的NavHostFragment。如果我使用相同的导航图,它将与开始导航发生冲突,并因此导致无限递归。

或者我应该对要启动的其他片段使用全屏DialogFragments吗?如果是这样,我如何告诉导航组件以全屏对话框形式启动对话框?是否有推荐的方法可以让Google执行此操作?

3 个答案:

答案 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和内存泄漏以及如何解决它们。我仍在处理某些部分,目前正在修复文档。