带有导航组件的 Fragment 中的 BottomNavigation

BottomNavigation in Fragment with navigation component

在我的应用程序中,我有一个带有 Material 设计的 BottomNavigation 的主屏幕。从这些屏幕上,我希望能够启动隐藏 BottomNavigation 的其他片段,以便新片段填满整个屏幕。然后应该可以通过后退箭头返回。我想你们都能想象得到,因为这是今天很常见的模式。

为了实现这一点,我想将 navigation component 与单个 activity 设计结合使用。我的想法是,我的 MainActivity 只包含一个 NavHostFragment,而 BottomNavFragment 包含另一个 NavHostFragment 以及 BottomNavigation。由于隐藏的可能性,我无法移动 BottomNavigation 到主Activity 布局。

我觉得这有点奇怪。我真的需要两个导航图和两个 NavHostFragments 吗? BottomNavFragment 中的 NavHostFragment 仅用于显示与 BottomNavigation 关联的相关片段。要导航到其他片段,我必须使用 Activity 中的 NavHostFragment。如果我使用相同的导航图,它会与开始导航发生冲突,从而导致无休止的递归。

或者我应该对我想开始的其他片段使用全屏 DialogFragments 吗?如果是这样,我如何告诉导航组件以全屏对话框的形式启动对话框? Google 有推荐的方法吗?

Google 建议使用 OnDestinationChangedListener 监听 NavController 当前目的地,并根据要求 ui 更新 ui。 Look here

我不知道这是否有帮助,但我为此花了几个小时。当时没有太多帮助。

How to use NavigationExtensions.kt in a Java project?

我将在底部导航中为每个选项卡使用一个 Navhostfragment 和多个图表。如果您需要更清楚的信息,我很乐意提供帮助。

NavHostFragment 基本上是用 ChildFragmentManager 创建一个片段,它有自己的返回堆栈,这使得处理返回堆栈更容易。

如果您曾经尝试过,在 Whosebug 中甚至还有一个合适的解决方案来处理嵌套片段中的返回堆栈 ChildFragmentManager 或者我找不到,你将初始父片段传递给子片段并在调用子片段的 onDestroy 时删除事务,等等,这里有一个 link 可以检查一下。我还看到他们用反射来解决它。

长话短说,这很难。 NavHostFragment 使它变得简单,NavController 也使查找开始目的地、当前目的地等属性变得容易。

如果您希望每个选项卡都有后退导航,您还需要拥有与选项卡一样多的 NavHostFragments,您还需要将它们与 ViewPager2 一起使用以实现嵌套导航。

我在 NavHostFragment 中看到的唯一问题是您无法使用 NavHostFragment.create 创建 NavHostFragment,这是我的 question,当您需要具有自定义属性时需要它例如 ViewModel 或 DynamicNavHostFragment 创建。

BottomNavigationView 扩展 Google 还存在另一个问题,前提是当 BottomNavigationView 本身位于片段内并且该片段被替换时它会泄漏。我打算为 FragmentManager 编写另一个扩展来解决问题。

我创建了一个 tutorial 来玩弄 NavHostFragments、NavController、ViewPager2、BottomNavigationView 和内存泄漏以及如何克服它们。还有一些部分我还在努力,我目前正在修复文档。