Обрабатывать навигационный стек в графе навигации NavController Android?

На панели инструментов есть кнопка настроек, которая открывает фрагмент, содержащий список опций для открытия других фрагментов.

Страница настроек имеет 2 варианта

  • Профиль
  • Сменить пароль

Пользователь может перейти на любую из страниц, а панель инструментов видна пользователю на каждой странице.

Если я нажимаю «Профиль» -> запускается фрагмент профиля -> Затем я нажимаю «Настройки» на панели инструментов -> запускается страница «Настройки».

Теперь, когда я нажимаю назад, меня перенаправляют на фрагмент профиля, чего я не хочу. Он должен перенаправлять на последнюю страницу, посещенную перед фрагментом настроек, поскольку фрагмент профиля и пароля являются подфрагментами для фрагмента настроек.

Это мой навигационный график для потока фрагментов настроек

 <fragment
    android:id="@+id/settingsFragment"
    android:name="com.mountmeru.view.settings.SettingsFragment"
    android:label="fragment_settings"
    tools:layout="@layout/fragment_settings">
    <action
        android:id="@+id/action_settingsFragment_to_profileFragment"
        app:destination="@id/profileFragment" />
    <action
        android:id="@+id/action_settingsFragment_to_resetPasswordFragment"
        app:destination="@id/resetPasswordFragment" />
</fragment>

Вот как я перехожу к профилю и фрагменту пароля

 view.findNavController().navigate(
        R.id.action_settingsFragment_to_profileFragment)

 view.findNavController().navigate(
        R.id.action_settingsFragment_to_resetPasswordFragment)



Ответы (1)


В графе навигации в ProfileFragment вы можете использовать:

<fragment
    android:id="@+id/profileFragment"            
    ...>

    <action
        android:id="@+id/action_profileFragment_to_settingsFragment"
        app:destination="@+id/settingsFragment"
        app:popUpTo="@id/profileFragment"
        app:popUpToInclusive="true" />

</fragment>

Дополнительную информацию о popUpTo и pupToInclusive можно найти здесь.

Вы также можете сделать это в коде (без изменения навигационного графика):

findNavController()
        .navigate(R.id.action_profileFragment_to_settingsFragment,
                null,
                NavOptions.Builder()
                    .setPopUpTo(R.id.profileFragment,
                     true).build()
        )
person Gabriele Mariotti    schedule 08.06.2020