我正在使用新的 AndroidX 导航框架。
我有几个片段都链接在导航链中。
片段A --> 片段B --> 片段C
FragmentC 有一个 Cancel 按钮,应该让我一路回到 FragmentA。
我应该做以下事情吗:
在 FragmentC 上调用方法:
Navigation.findNavController(view).navigateUp();
然后在 FragmentB 上监听一些回调并使用一些传递的参数或参数从 FragmentB 触发另一个 navigateUp() 函数
或者是否有一些方法可以做相当于 navigateUpTwice()
我最后做的是
Navigation.findNavController(view).popBackStack(R.id.fragmant_a,false)
在您创建的用于导航到起始片段(在您的情况下为 FragmentA)的操作下的 navigation.xml 文件中,添加以下内容
<action
....
app:popUpTo="@id/fragmentA"
app:popUpToInclusive="false"/>
这将弹出所有片段,直到 FragmentA 并将排除 FragmentA,因为 popUpToInclusive 设置为 false。
编辑: navigation.xml 文件的 FragmentC 标签下的完整操作形式类似于:
<fragment
android:id="@+id/FragmentC"
android:name="com.yourdomain.FragmentC"
android:label="FragmentC">
<action
android:id="@+id/action_fragmentC_to_fragmentA"
app:destination="@id/fragmentA"
app:popUpTo="@id/fragmentA"
app:popUpToInclusive="false"/>
</fragment>
试试这个,它对我有用。
findNavController().navigateUp()
findNavController().navigateUp()
您可以在 FragmentB --> FragmentC 的操作中将 pop 设置为 FragmentA,然后当您按回它时,它会转到 Fragment A 而不是 Fragment B
所以我发现自己处于不得不
navigateUp()
两次的情况,但有一个转折:我可以通过多条路径到达视图。可以这样想:
片段 A --> 片段 C --> 片段 D
片段 B --> 片段 C --> 片段 D
一般情况下,使用
popTo
xml属性或者popBackStack()
方法就可以了。不过这里是不能用的。幸运的是,你能做的是:
val navController = NavHostFragment.findNavController(this)
navController.navigateUp()
navController.navigateUp
正如其他人所指出的,这绝对不是性能优化。在任何可以通过单一路径到达片段 D 的情况下,请使用
popTo
代替。
如果您在他的回答中遇到类似@flagg10ma 的情况,您可以获取有关先前目的地的信息,然后在
id
电话中使用其popBackStack()
。像这样:
NavController navController = NavHostFragment.findNavController(this);
NavBackStackEntry prevEntry = navController.getPreviousBackStackEntry();
if (prevEntry == null) {
// There is no previous destination, so just pop once normally
navController.popBackStack();
return;
}
// Pop to previous destination and then pop that destination too (as we use inclusive=true)
navController.popBackStack(prevEntry.getDestination().getId(), true);