如何清除导航组件中的碎片堆栈?

c-a*_*-an 6 android android-fragments android-navigation

我像这样尝试使用 FragmentManager:

Navigation.findNavController(mView).popBackStack()
Run Code Online (Sandbox Code Playgroud)

并尝试使用FragmentManager.

val fm = activity!!.supportFragmentManager
Run Code Online (Sandbox Code Playgroud)

1.

fm.popBackStack()
Run Code Online (Sandbox Code Playgroud)

2.

fm.popBackStackImmediate()
Run Code Online (Sandbox Code Playgroud)

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

我还尝试将这些属性应用于graph_nav.xml

app:launchSingleTop="true"
app:popUpToInclusive="true"
Run Code Online (Sandbox Code Playgroud)

我将它们应用于 A 片段和 B 片段。

我想从A片段转到B片段。我想清除 B 片段之前的所有片段堆栈,只留下 B 片段。

小智 7

您需要将app:popUpToInclusive="true",app:launchSingleTop="true"和添加app:popUpTo="nav_graph_id"到您的 nav_graph.xml 中的操作标记。

<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>
Run Code Online (Sandbox Code Playgroud)

然后构建项目(以便创建方向文件),并编写:

findNavController().navigate(FirstFragmentDirections.clearBackStack())
Run Code Online (Sandbox Code Playgroud)

即使你有几个 nav_graphs,设置主/主 nav_graph 的 popUpTo id,而不是你写这个动作的那个,例如你的主 nav_graph 是“main_nav_graph.xml”,你在“some_other_nav_graph.xml”中编写上面的代码, 设置main_nav_graph.xml 的id。