#android #android-fragments #android-architecture-navigation #android-navigation #android-navigation-graph
#Android #android-архитектура-навигация
Вопрос:
Я использую навигационные компоненты для перехода от одного фрагмента к другому. Однако, когда пользователь нажимает кнопку «Назад», я хочу вернуться к первому фрагменту. Но он продолжает показывать второй фрагмент. Это мой nav_graph:
<?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/nav_graph"
app:startDestination="@id/fragment1">
<fragment
android:id="@ id/fragment2"
android:name="com.myapp.ui.fragments.Fragment2"
android:label="fragment_2" />
<fragment
android:id="@ id/fragment1"
android:name="com.myapp.ui.fragments.Fragment1"
android:label="fragment_1">
<action
android:id="@ id/action_fragment1_to_fragment2"
app:destination="@id/fragment2"
app:enterAnim="@anim/fragment_fade_enter"
app:exitAnim="@anim/fragment_fade_exit"
app:popUpTo="@id/fragment1" />
</fragment>
</navigation>
И вот как я запускаю навигацию в коде моего класса Fragment1:
viewModel.itemSelected.observe(viewLifecycleOwner) {
navigate(it)
}
….
fun navigate(id: Long){
val bundle = Bundle()
bundle.putLong("itemid", id)
getNavController().navigate(R.id.action_fragment1_to_fragment2, bundle)
}
Редактировать:
Исправлено назначение запуска в XML.
Правка 2: добавлено больше кода.
Ответ №1:
Вы используете LiveData для события. LiveData всегда кэширует установленное значение, поэтому, когда вы возвращаетесь к своему Fragment1, вы снова просматриваете LiveData и получаете то же значение во второй раз, что приводит к повторной навигации (). Еще раз.
Смотрите Это сообщение в блоге для получения дополнительной информации и альтернатив.
Комментарии:
1. Спасибо, но я уже пробовал это. Результатом стало то, что приложение завершило работу, когда я добавил popUpToInclusive.
2. Ваш начальный пункт назначения находится
overviewFragment
в соответствии с опубликованным вами кодом, так что он все еще должен быть в заднем стеке, верно?3. Ах, извините за ошибку, начальный фрагмент
fragment1
. Я упустил это из виду, когда готовил xml для SO. Я исправлю это в сообщении.4. Хорошо, тогда кажется, что вы не хотите
popUpTo
илиpopUpToInclusive
вообще. Можете ли вы включить сопутствующий код для того, куда вы вызываетеnavigate()
? Вы вызываете это внутриobserve
блока?5. Да, это правда, я вызываю это в блоке наблюдения.