Насколько я знаю, нет простого и красивого способа получить то, чего вы пытаетесь достичь. Хотя есть несколько возможных решений.
Использовать некоторый базовый фрагмент
У вас может быть базовый пункт назначения, который всегда находится внизу вашего стека, давайте назовем его baseDest
. В ваших действиях, которые должны очистить стек, вы всегда можете использовать
<action
android:id="..."
app:destination="@id/mainDestX"
app:popUpTo="@+id/baseDest"
app:popUpToInclusive="false" />
. Это всегда будет держать ваш baseDest в нижней части вашего стека, позволяя вам всегда открывать его. Чтобы добиться своего поведения при отжиме в одном из ваших основных пунктов назначения, вы можете:
- Переопределить метод
onBackPressed
во всех ваших основных окнах, чтобы закрыть приложение. (Это может быть легко сделано, если все ваши основные определения выходят из одного и того же класса) - Когда ваш фрагмент baseDest загружен из-за обратной печати, закройте приложение программным способом.
Переосмыслить Навигация в вашем приложении
Возможно, вам следует переосмыслить, как работает навигация в вашем приложении. Вместо того, чтобы иметь какую-то структуру графика, возможно, цикличную c, легче иметь дело с древовидными структурами навигации (которые также более понятны пользователям). Конечно, это не всегда вариант, но вы должны помнить об этом и подумать о реструктуризации вашей навигации.
Найти решение программно
Вручную реализовать все свои действия и навигации и использовать методы, предоставленные в NavController , чтобы вручную удалить все записи в вашем стеке перед переходом к одному из ваших основных пунктов назначения. Один из возможных способов сделать это - извлечь ваш навигационный контроллер с помощью метода findNavController в вашем фрагменте. Я не тестировал ни один из следующих методов, но вы можете попробовать:
- Выполнить
yourNavController.getGraph().clear()
с последующим yourNavController.navigate(yourDest)
- В начале вашего приложения перед любым фрагментом загружается с помощью
saved = yourNavController.saveState()
и при переходе к одному из ваших основных назначений используйте yourNavController.restoreState(saved)
, затем снова следует yourNavController.navigate(yourDest)
- Создайте новый NavGraph и используйте
yourNavController.setGraph(createdGraph)