android - четкий фрагмент после навигации в компоненте навигации - PullRequest
1 голос
/ 03 мая 2020

здесь есть некоторые проблемы.

скажем, у меня есть 3 фрагмента AB- C. Сначала я перемещаюсь от фрагмента A к B. Затем от фрагмента B я хочу перейти к фрагменту C и очистить фрагмент B от стека. Мне нужно очистить его во время навигации, потому что мне нужно, чтобы стек стал A- C, когда пользователь во фрагменте C, если пользователь щелкнет назад, пользователь вернется к фрагменту A, а во фрагменте также будет кнопка C чтобы перейти к фрагменту B

, пожалуйста, помогите мне в этом, вам нужно несколько советов, чтобы сделать это, или, если есть другое решение, поделитесь им здесь.

Спасибо

1 Ответ

0 голосов
/ 07 мая 2020

Этот вопрос сложен из-за ужасной документации Jetpack Navigation по Conditional Navigation, которая должна объяснить эту тему, но не может этого сделать, но ответ на самом деле довольно прост.

Все вы нужно 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)

И если вы хотите go вернуться к FragmentA из FragmentB или Фрагмент C, вы можете позвонить findNavController().popBackStack().

...