在导航组件中导航后,android-clear碎片。

问题描述 投票:0回答:1

这里有一些问题。

比如说我有3个片段A-B-C。首先,我从片段A导航到B,然后从片段B导航到片段C,并从栈中清除片段B。我需要在导航时清除它,因为我需要确保当用户在片段C中时,堆栈变成A-C,如果用户点击后退,用户将回到片段A,而且片段C中也有一个按钮来导航到片段B。

请帮助我在这一点上,需要一些建议做到这一点,或者如果有任何其他的解决方案,请在这里分享它。

谅谅

android kotlin android-jetpack android-architecture-navigation
1个回答
0
投票

这个问题很棘手,因为Jetpack导航的 惨不忍睹 关于 Conditional Navigation 这本应解释这个问题,但却没有做到,但答案其实很简单。

你所需要的是 popUpTopopUpToInclusive.

<?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().

© www.soinside.com 2019 - 2024. All rights reserved.