在导航控制器中杀死片段
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
【讨论】:
以上是关于在导航控制器中杀死片段的主要内容,如果未能解决你的问题,请参考以下文章