Android Jetpack Navigation 与 BottomNavigationView 的正确返回堆栈

Android Jetpack Navigation proper back stack with BottomNavigationView

OBS: 虽然仍然没有第一个 class 支持(在撰写本文时),Google 现在已经更新了他们的样本,并提供了一个示例认为这应该得到解决:https://github.com/googlesamples/android-architecture-components/tree/master/NavigationAdvancedSample

Android Codelab for Navigation 很好地描述了如何将架构组件导航与 BottomNavigationView 一起使用。但是假设我在 BottomNavigationViewTab1Tab2 中有 2 个选项卡。假设您在 Tab1 中浏览片段 Frag1 --> Frag2。现在,每当我转到 Tab2,然后返回 Tab1Frag1,2[=45 的片段返回堆栈=]没了,又换成了起点Frag1

我必须在应用程序中做什么才能使 BottomNavigationViewNavigation 保持其返回堆栈完整,即使我更改了标签页?并且,还要使 back/up 按钮行为与指南同步。

以前我是通过使用 ViewPager 并自行管理后台堆栈来完成此操作的,但是对于新的 Navigation 来说这并不是正确的方法。

提前致谢!


编辑:

有一个更详细的答案 here

主要原因是您只使用一个 NavHostFragment 来保存应用程序的整个后台堆栈。

所以解决方案是每个选项卡都应该拥有自己的返回堆栈。

  • 在您的主布局中,用 FrameLayout.
  • 包裹每个选项卡片段
  • 每个选项卡片段都是一个 NavHostFragment 并包含自己的导航图,以便使每个选项卡片段都有自己的返回堆栈。
  • BottomNavigtionView 添加 BottomNavigationView.OnNavigationItemSelectedListener 以处理每个 FrameLayout 的可见性。

如果不想把所有的片段都保留在内存中,可以用app:popUpToapp:popUpToInclusive="true"弹出不想保留的片段

新的导航架构目前不支持此功能。我也对此感到非常沮丧,因为这是当今应用程序中非常基本的功能,而且很多应用程序现在都在使用底部导航。有一个 运行ning 线程,如果你想关注它的话。他们说他们会为此提出一个长期解决方案,但对于较短的 运行,他们将提供一个示例来说明如何解决这个问题。 https://issuetracker.google.com/issues/80029773#comment25