使用 Navigation 组件从 backstack 中移除 Fragment
Remove Fragment from backstack with Navigation components
-
android-fragments
-
kotlin
-
android-architecture-navigation
-
android-jetpack-navigation
-
android-navigation-graph
我有一个带有 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>
android-fragments
kotlin
android-architecture-navigation
android-jetpack-navigation
android-navigation-graph
我有一个带有 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>