Проблема с навигационным компонентом Android Jetpack с фрагментом заставки в качестве корневого пункта назначения

Предположим, у нас есть 3 фрагмента с панелями инструментов с кнопкой вверх

SplashFragment -> FragmentA -> FragmentB 

Это ожидаемый поток приложения. При достижении FragmentB, когда пользователь нажимает кнопку "Назад", он должен перейти к FragmentA и снова при нажатии кнопки "Назад" приложение должно выйти. Как мы можем добиться такого поведения, используя компонент навигации? Я пытался сделать это с помощью app:popUpTo внутри action Мне как-то удалось заставить его работать для кнопки "назад", но поведение кнопки "вверх" не изменилось.

Нужна помощь по этому вопросу.

4 ответа

Предупреждение: это устарело в Navigation alpha08, И ссылка является текущим решением.

Это может быть ответом, который вы хотите. использование app:clearTask="true"

<fragment
    android:id="@+id/splashFragment"
    android:name="xxx.SplashFragment"
    android:label="fragment_splash"
    tools:layout="@layout/fragment_splash">
    <action
        android:id="@+id/action_splashFragment_to_mainFragment"
        app:destination="@id/mainFragment"
        app:enterAnim="@anim/anim_right_in"
        app:exitAnim="@anim/anim_left_out"
        app:popEnterAnim="@anim/anim_left_in"
        app:popExitAnim="@anim/anim_right_out"
        app:clearTask="true"/>

Компонент навигационной архитектуры - заставка

Вот мое решение. fragmentA->fragmentB->fragmentcна спине нажмите кнопку от FragmentC к FragmentB, а затем снова нажмите, и вы хотите выйти из приложения формы. добавьте эту строку в действие FragmentA.

      app:launchSingleTop="true"
app:popUpTo="@+id/fragmentA"
app:popUpToInclusive="true"

У меня есть аналогичный поток на месте, что работает, и я считаю, что чистое решение состоит в том, чтобы иметь FragmentA в качестве начальной точки вашего навигационного графика (который всегда будет помещаться в верхнюю часть backstack на ланче), тогда вы хотите перейти (возможно, условно) к SplashFragment на onStart (или ранее в жизненном цикле) вашего FragmentAи, наконец, когда вы хотите, чтобы ваш SplashFragment исчез, вы используетеfindNavController().popBackStack() выскочить фрагмент. тогда только фрагменты A и B останутся в вашем стеке, и обратно будет работать как положено.

надеюсь это поможет.

Вы можете попытаться сделать это следующим образом:

После того, как приложение запустит Fragment-A, очистите backstack т.е. SplashFragment, теперь, когда пользователь перемещается вперед, все то же самое, но после возврата к Fragment-A, если он нажимает кнопку возврата. Приложение закрывается.

Надеюсь это поможет!