【问题标题】:android-clear fragment after navigate in navigation component在导航组件中导航后的 android-clear 片段
【发布时间】:2020-05-07 11:36:08
【问题描述】:

这里有一些问题。

假设我有 3 个片段 A-B-C。首先我从片段 A 导航到 B。然后从片段 B 我想导航到片段 C 并从堆栈中清除片段 B。我需要在导航时清除它,因为当用户在片段 C 中时,我需要确保堆栈变为 A-C,如果用户单击返回,用户将返回片段 A,并且片段 C 中还有一个按钮可以导航到片段 B

请帮助我,需要一些建议,或者如果有任何其他解决方案,请在此处分享。

谢谢

【问题讨论】:

  • @mkm TesterKtl 询问的是 Jetpack 导航组件,您发布的问题与它无关。
  • 有时我想知道为什么我会回答作者不关心的问题
  • @EpicPandaForce 抱歉回复晚了,我没有注意到这个问题的通知。在您在这里发布答案之前,我已经得到了答案。不过谢谢你的回答,这个问题我也用这个解决方案

标签: android kotlin android-jetpack android-architecture-navigation


【解决方案1】:

这个问题很棘手,因为 Jetpack Navigation 在Conditional Navigation 上的 abysmal 文档应该解释这个主题但没有这样做,但答案实际上很简单。

您只需要popUpTo 和popUpToInclusive。

<?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/navigation"
    app:startDestination="@id/splash_graph"
    tools:ignore="UnusedNavigation">

    <navigation
        android:id="@+id/splash_graph"
        app:startDestination="@id/splash_fragment">

        <action
            android:id="@+id/splash_to_main_graph"
            app:destination="@id/main_graph"
            app:popUpTo="@id/splash_graph"
            app:popUpToInclusive="true" />

        <fragment
            android:id="@+id/splash_fragment"
            android:name="fqn.SplashFragment"
            tools:layout="@layout/splash_fragment" />
    </navigation>

    <navigation
        android:id="@+id/main_graph"
        app:startDestination="@id/fragment_a">

        <action
            android:id="@+id/fragment_a_to_fragment_b"
            app:destination="@id/fragment_b"
            app:enterAnim="@anim/slide_in_from_left"
            app:exitAnim="@anim/slide_out_to_right"
            app:popEnterAnim="@anim/slide_out_to_left"
            app:popExitAnim="@anim/slide_in_from_left" />

        <action
            android:id="@+id/fragment_b_to_fragment_c"
            app:destination="@id/fragment_c"
            app:enterAnim="@anim/slide_in_from_left"
            app:exitAnim="@anim/slide_out_to_right"
            app:popEnterAnim="@anim/slide_out_to_left"
            app:popExitAnim="@anim/slide_in_from_left"
            app:popUpTo="@id/fragment_b"
            app:popUpToInclusive="true" />

        <action
            android:id="@+id/fragment_c_to_fragment_b"
            app:destination="@id/fragment_b"
            app:enterAnim="@anim/slide_in_from_left"
            app:exitAnim="@anim/slide_out_to_right"
            app:popEnterAnim="@anim/slide_out_to_left"
            app:popExitAnim="@anim/slide_in_from_left"
            app:popUpTo="@id/fragment_c"
            app:popUpToInclusive="true" />

        <fragment
            android:id="@+id/fragment_a"
            android:name="fqn.FragmentA"
            tools:layout="@layout/fragment_a" />

        <fragment
            android:id="@+id/fragment_b"
            android:name="fqn.FragmentB"
            tools:layout="@layout/fragment_b" />

        <fragment
            android:id="@+id/fragment_c"
            android:name="fqn.FragmentC"
            tools:layout="@layout/fragment_c" />

    </navigation>
</navigation>

然后应该就这么简单

// FragmentA
findNavController().navigate(R.id.fragment_a_to_fragment_b)

// FragmentB
findNavController().navigate(R.id.fragment_b_to_fragment_c)

// FragmentC
findNavController().navigate(R.id.fragment_c_to_fragment_b)

如果你想从FragmentB或者FragmentC回到FragmentA,可以拨打findNavController().popBackStack()。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多