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
一起使用。但是假设我在 BottomNavigationView
、Tab1 和 Tab2 中有 2 个选项卡。假设您在 Tab1 中浏览片段 Frag1 --> Frag2。现在,每当我转到 Tab2,然后返回 Tab1,Frag1,2[=45 的片段返回堆栈=]没了,又换成了起点Frag1。
我必须在应用程序中做什么才能使 BottomNavigationView
和 Navigation 保持其返回堆栈完整,即使我更改了标签页?并且,还要使 back/up 按钮行为与指南同步。
以前我是通过使用 ViewPager
并自行管理后台堆栈来完成此操作的,但是对于新的 Navigation 来说这并不是正确的方法。
提前致谢!
编辑:
有一个更详细的答案 here。
主要原因是您只使用一个 NavHostFragment
来保存应用程序的整个后台堆栈。
所以解决方案是每个选项卡都应该拥有自己的返回堆栈。
- 在您的主布局中,用
FrameLayout
. 包裹每个选项卡片段
- 每个选项卡片段都是一个
NavHostFragment
并包含自己的导航图,以便使每个选项卡片段都有自己的返回堆栈。
- 向
BottomNavigtionView
添加 BottomNavigationView.OnNavigationItemSelectedListener
以处理每个 FrameLayout
的可见性。
如果不想把所有的片段都保留在内存中,可以用app:popUpTo
和app:popUpToInclusive="true"
弹出不想保留的片段
新的导航架构目前不支持此功能。我也对此感到非常沮丧,因为这是当今应用程序中非常基本的功能,而且很多应用程序现在都在使用底部导航。有一个 运行ning 线程,如果你想关注它的话。他们说他们会为此提出一个长期解决方案,但对于较短的 运行,他们将提供一个示例来说明如何解决这个问题。 https://issuetracker.google.com/issues/80029773#comment25
OBS: 虽然仍然没有第一个 class 支持(在撰写本文时),Google 现在已经更新了他们的样本,并提供了一个示例认为这应该得到解决:https://github.com/googlesamples/android-architecture-components/tree/master/NavigationAdvancedSample
Android Codelab for Navigation 很好地描述了如何将架构组件导航与 BottomNavigationView
一起使用。但是假设我在 BottomNavigationView
、Tab1 和 Tab2 中有 2 个选项卡。假设您在 Tab1 中浏览片段 Frag1 --> Frag2。现在,每当我转到 Tab2,然后返回 Tab1,Frag1,2[=45 的片段返回堆栈=]没了,又换成了起点Frag1。
我必须在应用程序中做什么才能使 BottomNavigationView
和 Navigation 保持其返回堆栈完整,即使我更改了标签页?并且,还要使 back/up 按钮行为与指南同步。
以前我是通过使用 ViewPager
并自行管理后台堆栈来完成此操作的,但是对于新的 Navigation 来说这并不是正确的方法。
提前致谢!
编辑:
有一个更详细的答案 here。
主要原因是您只使用一个 NavHostFragment
来保存应用程序的整个后台堆栈。
所以解决方案是每个选项卡都应该拥有自己的返回堆栈。
- 在您的主布局中,用
FrameLayout
. 包裹每个选项卡片段
- 每个选项卡片段都是一个
NavHostFragment
并包含自己的导航图,以便使每个选项卡片段都有自己的返回堆栈。 - 向
BottomNavigtionView
添加BottomNavigationView.OnNavigationItemSelectedListener
以处理每个FrameLayout
的可见性。
如果不想把所有的片段都保留在内存中,可以用app:popUpTo
和app:popUpToInclusive="true"
弹出不想保留的片段
新的导航架构目前不支持此功能。我也对此感到非常沮丧,因为这是当今应用程序中非常基本的功能,而且很多应用程序现在都在使用底部导航。有一个 运行ning 线程,如果你想关注它的话。他们说他们会为此提出一个长期解决方案,但对于较短的 运行,他们将提供一个示例来说明如何解决这个问题。 https://issuetracker.google.com/issues/80029773#comment25