AndroidX 导航 navigateUp 两次

问题描述 投票:0回答:6

我正在使用新的 AndroidX 导航框架。

我有几个片段都链接在导航链中。

片段A --> 片段B --> 片段C

FragmentC 有一个 Cancel 按钮,应该让我一路回到 FragmentA。

我应该做以下事情吗:
在 FragmentC 上调用方法:

 Navigation.findNavController(view).navigateUp();

然后在 FragmentB 上监听一些回调并使用一些传递的参数或参数从 FragmentB 触发另一个 navigateUp() 函数

或者是否有一些方法可以做相当于 navigateUpTwice()

android android-navigation androidx
6个回答
19
投票

我最后做的是

Navigation.findNavController(view).popBackStack(R.id.fragmant_a,false)

4
投票

在您创建的用于导航到起始片段(在您的情况下为 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>

3
投票

试试这个,它对我有用。

findNavController().navigateUp()
findNavController().navigateUp()

2
投票

您可以在 FragmentB --> FragmentC 的操作中将 pop 设置为 FragmentA,然后当您按回它时,它会转到 Fragment A 而不是 Fragment B


0
投票

所以我发现自己处于不得不

navigateUp()
两次的情况,但有一个转折:我可以通过多条路径到达视图。可以这样想:

片段 A --> 片段 C --> 片段 D

片段 B --> 片段 C --> 片段 D

一般情况下,使用

popTo
xml属性或者
popBackStack()
方法就可以了。不过这里是不能用的。幸运的是,你能做的是:

val navController = NavHostFragment.findNavController(this)
navController.navigateUp()
navController.navigateUp

正如其他人所指出的,这绝对不是性能优化。在任何可以通过单一路径到达片段 D 的情况下,请使用

popTo
代替。


0
投票

如果您在他的回答中遇到类似@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);
© www.soinside.com 2019 - 2024. All rights reserved.