如何在导航组件中清除Fragment的后退栈?

8

我尝试使用FragmentManager来实现:

Navigation.findNavController(mView).popBackStack()

我尝试使用FragmentManager

val fm = activity!!.supportFragmentManager

1.

fm.popBackStack()

2.

fm.popBackStackImmediate()

但它们没有起作用。我的意思是,它们似乎弹出了所有片段。

我还尝试在graph_nav.xml中应用这些属性:

app:launchSingleTop="true"
app:popUpToInclusive="true"

我在A片段和B片段中都使用了它们。

我想从A片段前往B片段,并且我想在B片段之前清除所有的片段堆栈,只保留B片段。

1个回答

10
你需要在nav_graph.xml的action标签中添加app:popUpToInclusive="true"app:launchSingleTop="true"app:popUpTo="nav_graph_id"
<fragment
android:id="@+id/firstFragment"
android:name="com.example.ui.FirstFragment"
android:label="First"
tools:layout="@layout/fragment_first" >
<action
    android:id="@+id/clearBackStack"
    app:destination="@id/secondFragment"
    app:launchSingleTop="true"
    app:popUpTo="@+id/nav_graph"
    app:popUpToInclusive="true" /></fragment>

然后构建项目(以便创建指南文件),并编写以下内容:

findNavController().navigate(FirstFragmentDirections.clearBackStack())

即使您有多个导航图,也应将主/主页导航图的popUpTo ID设置为其中之一,而不是在编写此操作的导航图中设置,例如,您的主导航图为“main_nav_graph.xml”,并且您在“some_other_nav_graph.xml”中编写上述代码,请设置main_nav_graph.xml的ID。


我没有nav_graph.id。我应该创建<action>标签并将id放在navgraph的根目录中吗? - StayCool
如果您只有一个片段且没有任何操作,我们该怎么办? - Fazal Hussain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接