【问题标题】:Remove fragment in backstack with navigation component使用导航组件删除后台堆栈中的片段
【发布时间】:2020-06-24 14:06:43
【问题描述】:

我的应用正在使用导航组件。在这种情况下,我有四个片段加载顺序是 A->B->C->D。在片段 D 中,当我完成所有操作后,我想直接返回片段 A 并同时删除片段 B、C、D。 有人有这个案例的解决方案吗?感谢您的回复!

【问题讨论】:

    标签: android navigation fragment


    【解决方案1】:

    您可以通过检查文档中的目标情况来解决它们。

    link 1

    link 2

    每个导航操作都会将一个目的地添加到后退堆栈中。如果您要在此流程中反复导航,则您的后台堆栈将包含每个目的地的多组(A、B、C、A、B、C、A 等)。为了避免这种重复,您可以在将您从目的地 C 带到目的地 A 的操作中指定 app:popUpTo 和 app:popUpToInclusive,如下例所示:

    <fragment
    android:id="@+id/c"
    android:name="com.example.myapplication.C"
    android:label="fragment_c"
    tools:layout="@layout/fragment_c">
    
    <action
        android:id="@+id/action_c_to_a"
        app:destination="@id/a"
        app:popUpTo="@+id/a"
        app:popUpToInclusive="true"/>
    

    到达目的地 C 后,回栈包含每个目的地(A、B、C)的一个实例。当导航回到目的地 A 时,我们还弹出了 A,这意味着我们在导航时从堆栈中删除 B 和 C。使用 app:popUpToInclusive="true",我们还将第一个 A 从堆栈中弹出,有效地清除它。请注意,如果您不使用 app:popUpToInclusive,您的后台堆栈将包含目标 A 的两个实例。

    【讨论】:

    • 感谢您的帮助。我忘记添加 app:popUpToInclusive="true" 所以有问题:D
    • 谢谢。需要两个 app:popUpTo="@+id/a" app:popUpToInclusive="true"
    • 您不需要添加 app:destination="@id/a" 和 app:popUpToInclusive="true"。在这种情况下,只需添加 app:popUpTo="@+id/a" 就足够了,并且不会有两个 A 实例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多