如何使它在片段化后无法再使用“后退”按钮导航到最后一个片段?

时间:2019-05-26 01:17:04

标签: android android-jetpack

我的导航结构如下:

StaringFragment -> nestedNavGraph
                         |
                   HomeFragment -> SecondFragment

我需要这样做,以便在用户从StartingFragment导航到nestedNavGraph之后,用户不再可以单击“后退”按钮返回到StartingFragment

我基本上是在执行权限检查,如果检查成功,我将使用以下代码从StartingFragment导航到nestedNavGraph

findNavController(R.id.nav_host_frag).navigate(R.id.nestedNavGraph)

然后,在导航图编辑器中StartingFrag -> nestedNavGraph之间的操作箭头上,我将popUpTo设置为HomeFragment,并将包含在内的参数设置为true。我是否误解了文档?

在我离开StartingFragment后立即将其从后栈中删除的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

根据the documentation,您将app:popUpTo设置为您要弹出的目的地-您不想弹出HomeFragment,而是想要弹出StartingFragment,因此应将{{ 1}}到StartingFragment的ID。

请注意,根据Principles of Navigation,您应该始终有一个固定的起始目标-您不应该为conditional navigation使用起始目标-导航中的许多API,例如NavigationUI,假设您正确地遵循了导航原理,并且图形的起始目标仍保留在您的后堆栈中。

请记住,Android将在返回到活动时(例如,在用户手动撤消您要求的权限后)恢复您的状态(包括您当时所在的片段)-片段本身(或活动(如果获得许可)整个应用程序中的每个屏幕上实际上都是全局要求的),应该始终检查权限-您不能依赖始终被调用的StartingFragment。

答案 1 :(得分:0)

我还没有使用过导航库,但是通过阅读this bit in the documentation也许您只是有错字,需要将popTo替换为popUpTo吗?

  

要在从一个目的地导航到另一个目的地时弹出目的地,请向关联的元素添加 app:popUpTo 属性。 app:popUpTo 告诉导航库在对navigation()的调用中从后堆栈中弹出一些目标。该属性值是应保留在堆栈中的最新目的地的ID。

     

您还可以包含 app:popUpToInclusive =“ true” ,以指示在 app:popUpTo 中指定的目标也应从堆栈中删除。