在导航控制器中杀死片段

Posted

技术标签:

【中文标题】在导航控制器中杀死片段【英文标题】:Kill fragment in navigation controller 【发布时间】:2019-11-06 23:20:51 【问题描述】:

我的fragment流程是这样的

Main -> A -> B -> C ->A

在片段c中,它有一个提交按钮,它将返回到A。 当我按下 A 中的后退按钮时,我希望它回到 Main。但它会返回片段 c。

在片段 C 中,我使用了这个

 findNavController().navigate(R.id.action_c_to_a)

nav_graph.xml

 <fragment
        android:id="@+id/fragmentC"
        android:name="xxx"
        android:label="xxx">
        <action
            app:launchSingleTop="true"
            app:popUpTo="@+id/fragmentA"
            app:popUpToInclusive="true"
            android:id="@+id/action_c_to_a"
            app:destination="@id/fragmentA" />
    </fragment>

【问题讨论】:

当您导航到它时,您确定您的堆栈中有A 吗?您的配置已正确设置并按您希望的方式工作。 我明白你想做什么。但是在这种情况下,您应该实现“向上”导航,而不是“返回”。用户应该期待返回,而不是返回。 【参考方案1】:

为什么不弹出到片段A?您可以只调用 findNavController().popBackStack(R.id.fragmentA, false) 而不是使用操作进行导航。

【讨论】:

不工作 val action = CheckoutFragmentDirections.actionCheckoutFragmentToProductFragment() findNavController().navigate(action)【参考方案2】:

尝试从后台删除/杀死片段来查看我的完整解决方案。

Navigation Component set transition animation programmatically

【讨论】:

【参考方案3】:

您可以覆盖后退按钮的行为来执行此操作。 Provide custom back navigation

【讨论】:

【参考方案4】:

在 nav_graph 里面添加这个 action 标签

app:popUpTo="@id/homeFragment"

见:Not able to destroy fragment from Nav Controller in Android

【讨论】:

【参考方案5】:

这个想法是设置app:popUpTo而不设置app:destination。事实上,设置app:destination 将创建一个片段并将其添加到你不想要的后台堆栈中。

你可以删除:

app:destination="@id/fragmentA"

如果你有这个:

app:popUpTo="@+id/fragmentA"

它会真正弹出回栈直到fragmentA

【讨论】:

以上是关于在导航控制器中杀死片段的主要内容,如果未能解决你的问题,请参考以下文章

在导航控制器上添加片段而不是替换片段?

如果使用导航控制器,如何删除某些片段中的底部导航视图和工具栏?

使用导航控制器创建两次的片段

活动和片段问题中的导航控制器

使用导航控制器按下后退按钮后如何防止前一个片段显示?

导航组件:找不到 NavController