navigateUp() 和 popBackStack() 的区别

Raú*_*aúl 3 navigation android kotlin android-studio

我正在创建一个简单的 ToDo 应用程序并检查导航方法以从 AddTask Fragment 返回到我的 mainFragment。我发现我可以使用navigateUp() 和popBackStack() 返回,但我不明白其中的区别。

当我使用这个时:

Navigation.findNavController(it).navigateUp()
Run Code Online (Sandbox Code Playgroud)

或这个:

Navigation.findNavController(it).popBackStack()
Run Code Online (Sandbox Code Playgroud)

我回到 mainFragment ,我想,addTaskFragment 从堆栈中弹出,所以有人可以解释我吗?

Bjö*_*hel 8

对不起,(编辑:以前)接受的答案是绝对错误navigateUp()的,如果有的话,也会从 backstack 中弹出顶部片段。

对于初学者:如果您从应用程序中到达当前目的地,它们的行为完全相同。

仅当您使用来自不同应用的深层链接到达当前目的地时,它们的行为才会有所不同:

navigateUp() 将离开您的应用程序并返回导航到您应用程序中深层链接的应用程序。

popBackStack() 将尝试在您的 backstack 中后退一步,如果没有 backstack 条目,则不会执行任何操作。

您可以阅读以下差异:https : //developer.android.com/reference/androidx/navigation/NavController#navigateUp()

navigateUp() 尝试在导航层次结构中向上导航。适用于当用户按下应用程序 UI 左上(或开始)角标有向左(或开始)箭头的“向上”按钮时。

当用户没有从应用程序自己的任务到达当前目的地时,Up 的预期行为与 Back 不同。例如,如果用户正在查看当前应用程序中的文档或链接,该活动托管在另一个应用程序的任务上,用户单击了该链接。在这种情况下,当前活动(由用于创建此 NavController 的上下文确定)将完成,用户将被带到此应用程序中的适当目的地执行其自己的任务。

popBackStack() 尝试弹出控制器的返回堆栈。类似于当关联的导航主机具有焦点时用户按下系统返回按钮。

  • 这很奇怪,因为android文档对后退和向上按钮的说法相反https://developer.android.com/guide/navigation/navigation-principles#up_and_back_are_identical_within_your_apps_task (4认同)
  • @JustGotStared 不完全是,最简单的描述可能是如果用户来自另一个应用程序,navigateUp 返回到另一个应用程序,则 popBackStack 仅返回当前应用程序内。如果有任何地方可以返回,两者都会从返回堆栈中弹出片段。 (2认同)