使用BottomNavigationView实现Android Jetpack Navigation的正确返回栈

11

OBS:目前(撰写时)仍没有官方支持,但是谷歌已经更新了他们的示例,展示了他们认为应该如何解决:https://github.com/googlesamples/android-architecture-components/tree/master/NavigationAdvancedSample

Android Navigation Codelab 很好地介绍了如何将导航架构组件(Navigation Architecture Component)与 BottomNavigationView 结合使用。但假设我在BottomNavigationView 中有 2 个选项卡,Tab1Tab2。并且让我们假设在Tab1 中通过片段 Frag1 --> Frag2 进行导航。现在,每当我转到 Tab2,然后再回到 Tab1 时,Frag1,2 的片段返回堆栈消失,并被替换为起始点 Frag1

在应用程序中,我要如何使用BottomNavigationViewNavigation以保持其返回堆栈在标签更改时保持完整,并使后退/上一步按钮的行为与指南保持同步。

以前我使用ViewPager并自己管理返回堆栈来完成此操作,但是这似乎不是使用新的Navigation的正确方法。

提前致谢!


编辑:

这里有一个更详细的答案链接.

2个回答

5
主要原因是你只使用了一个NavHostFragment来保存整个应用程序的后退栈。
解决方案是每个选项卡应该保存它自己的后退栈:
1. 在主布局中,使用FrameLayout包装每个选项卡片段。 2. 每个选项卡片段都是一个NavHostFragment,并包含自己的导航图以使每个选项卡片段拥有自己的后退栈。 3. 添加BottomNavigationView.OnNavigationItemSelectedListenerBottomNavigtionView中以处理每个FrameLayout的可见性。
如果您不想将所有片段保存在内存中,则可以使用app:popUpToapp:popUpToInclusive="true"来弹出您不想保留的片段。

这确实是一种有趣的方法 - 以那种方式切换可见性。我今天稍后会尝试并在感觉正确时返回一个接受。在此期间谢谢! - Algar
我不能说我非常喜欢始终保持多达5个片段处于活动状态(尽管其中大多数是不可见的)。在这种情况下,使用ViewPager是否感觉更好?这样,您只需要保留后退堆栈,而不是整个填充的片段本身。@jaychang0917对此有什么想法吗? - Algar
@jaychang0917,你能否解释一下我该如何使用 app:popUpToapp:popUpToInclusive="true" 吗? - AnEnigmaticBug

1
这在新的导航架构中目前不受支持。我也很失望,因为它是当今应用程序中非常基本的功能,并且许多应用程序现在都在使用底部导航。如果你想关注它,可以查看正在运行的线程。他们说他们将提出一个长期解决方案,但在短期内,他们会提供一个样例来解决这个问题。https://issuetracker.google.com/issues/80029773#comment25

这是谷歌针对此问题的官方解决方法 https://github.com/android/architecture-components-samples/tree/master/NavigationAdvancedSample - Sharad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接