我的导航结构如下:
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
后立即将其从后栈中删除的正确方法是什么?
答案 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 中指定的目标也应从堆栈中删除。