【问题标题】:Difference between navigateUp() and popBackStack()navigateUp() 和 popBackStack() 的区别
【发布时间】:2021-04-24 17:29:24
【问题描述】:

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

当我使用这个时:

Navigation.findNavController(it).navigateUp()

或者这个:

Navigation.findNavController(it).popBackStack()

我回到 mainFragment 并且我认为 addTaskFragment 是从堆栈中弹出的,所以有人可以解释一下吗?

【问题讨论】:

    标签: android android-studio kotlin navigation


    【解决方案1】:

    抱歉,(edit:之前)接受的答案是绝对错误的,navigateUp() 也会从 backstack 中弹出顶部的片段,如果有的话。

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

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

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

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

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

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

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

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

    【讨论】:

    • 如果我错了,请纠正我,但简而言之,我可以说 navigateUp() 确实从堆栈中删除(或弹出)片段,或者它返回到前一个片段(类似于 onBackPressed( ))。
    • @JustGotStared 不完全是,最简单的描述可能是,如果用户来自另一个应用程序,则 navigateUp 会返回另一个应用程序,popBackStack 只会返回当前应用程序。如果有任何可以返回的地方,两者都会从 backstack 中弹出片段。
    【解决方案2】:

    这是关于 android backstack 的。每当您启动应用程序时,活动都会被添加到活动回栈中(例如Activity1)。现在,如果您启动Activity2,它将被添加到堆栈顶部。如果按下后退按钮,Activity2 将被销毁并从堆栈顶部弹出,并且位于Activity2 下方的活动将被恢复。检查此图以更好地了解情况。

    堆栈也适用于片段。假设您启动FragmentA,然后启动FragmentB。所以堆栈将像顶部的FragmentB 和底部的FragmentAFragmentB 现在正在屏幕上显示。如果你使用popBackStack(),显然它会破坏FragmentB并将其从堆栈顶部弹出,然后它会检查堆栈中当前的顶部片段,即FragmentA,因此它将被恢复.但是如果你调用navigateUp(),它会向上浏览堆栈,就像它的名字一样。当您从FragmentB 向上导航时,您将再次到达堆栈中的FragmentA。这就是为什么这两种方法具有相同的输出。但重点是navigateUp() 不会从栈顶弹出FragmentB 也不会被销毁。

    【讨论】:

    • 这根本不是真的,请检查我的回答。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-07
    • 2011-10-20
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多