Проблема с навигационным компонентом 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, если он нажимает кнопку возврата. Приложение закрывается.
Надеюсь это поможет!