使用 Navigation 组件从 backstack 中移除 Fragment

Remove Fragment from backstack with Navigation components

我有一个带有 navHost 片段的 PinCreateActivity,其中包含 2 个片段 PinSetup 和 PinCreate 片段。

当 Activity 启动时,PinSetup 是默认片段,然后单击按钮导航到 PinCreate 片段。我想要的是 PinCreate 片段,当用户单击后退按钮而不是像 PinCreateActivity 那样转到 PinSetup 并导航到后台堆栈时。所以我想当我从 PinSetup 导航到 PinCreate 片段时,我必须从 backStack 中删除 PinSetup。我该怎么做?

navigation_graph.xml

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/pin_create_nav_graph"
    app:startDestination="@id/pinSetupFragment">

    <fragment
        android:id="@+id/pinSetupFragment"
        android:name="com.example.ui.fragments.pin.PinSetupFragment"
        android:label="Create PIN"
        tools:layout="@layout/fragment_pin_setup" >
        <action
            android:id="@+id/action_pinSetupFragment_to_pinCreateFragment"
            app:destination="@id/pinCreateFragment" />
    </fragment>
    <fragment
        android:id="@+id/pinCreateFragment"
        android:name="com.example.ui.fragments.pin.PinCreateFragment"
        android:label="Your PIN"
        tools:layout="@layout/fragment_pin_create" />
</navigation>

PinCreateActivity

private lateinit var navController: NavController

 override fun onCreate(savedInstanceState: Bundle?) {
 
    ...
    navController = Navigation.findNavController(this, R.id.pin_create_host_fragment)


    // onClick
    navController.navigate(R.id.action_pinSetupFragment_to_pinCreateFragment)

 }

如果您在弹出窗口时需要一些额外的逻辑,您可以通过 Kotlin 代码以编程方式执行此操作。 但是,如果您只需要从返回堆栈中删除 PinSetupFragment,则可以在导航图 xml 文件中执行此操作。

因此,如果您只是要在没有任何其他额外逻辑的情况下弹出片段,从后台堆栈弹出 PinSetupFragment 的最佳方法是更新 navigation_graph.xml 文件。

只需将这两行添加到您的操作中:

app:popUpTo="@id/pinSetupFragment"
app:popUpToInclusive="true"

因此,您的 navigation_graph.xml 文件将如下所示:

<?xml version="1.0" encoding="utf-8"?>
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/pin_create_nav_graph"
    app:startDestination="@id/pinSetupFragment">

    <fragment
        android:id="@+id/pinSetupFragment"
        android:name="com.example.ui.fragments.pin.PinSetupFragment"
        android:label="Create PIN"
        tools:layout="@layout/fragment_pin_setup" >
        <action
            android:id="@+id/action_pinSetupFragment_to_pinCreateFragment"
            app:destination="@id/pinCreateFragment"
            app:popUpTo="@id/pinSetupFragment"
            app:popUpToInclusive="true" />
    </fragment>
    <fragment
        android:id="@+id/pinCreateFragment"
        android:name="com.example.ui.fragments.pin.PinCreateFragment"
        android:label="Your PIN"
        tools:layout="@layout/fragment_pin_create" />
</navigation>