Возможно, не полностью отвечает на вопрос, но все же может быть полезной информацией для тех, кто, как я, новичок в реализации архитектуры навигации
Это классическая проблема, когда у вас есть «условный» поток.
В настоящее время я обдумываю ту же проблему и могу поделиться своими советами по ее решению.
Если речь шла не о «обратной навигации», а о переносе пользователя на определенный экран, но в то же время об очисткеbackstack, это было бы сделано с использованием
findNavController().popBackStack(R.id.login, true)
Подробнее об этом можно прочитать здесь .
Но еслипользователь нажимает обратно в LoginFragment, я хочу, чтобы приложение завершало работу
То, что вы не упомянули, это то, какую кнопку «назад» вы используете, но думали, чтобы ее решить. Принципы навигации объясняет очень хорошо.
Давайте поговорим о кнопке «Вверх» на панели действий
Что вы не упомянули, но я столкнулся с тем, что вы можете столкнуться с кнопкой «вверх» на панели действийв отличие от кнопки «назад» системы внизу.
Кнопка «Вверх» не должна появляться в вашем случае, поскольку экран входа в систему подобен месту назначения вашего приложения, а кнопка «Вверх» никогда не выходит из приложения.
Но если по какой-то причине вам придется это переопределить, то вы можете сделать это, переопределив onOptionsItemSelected()
override fun onOptionsItemSelected(item: MenuItem): Boolean {
if (item.itemId == android.R.id.home) {
finish()
}
return super.onOptionsItemSelected(item)
}
Давайте поговорим о системной кнопке «назад»
Документы по Навигационной архитектуре рассказывают о том, как справиться с «пользовательской навигацией» , и это не очень хакерское решение.Оно работает.
Этот SO Ответ показывает код для справки.
Но есть проблема!OnBackPressListener
был введен только в последнем нестабильном выпуске, и если вы не можете обновить app compat
до 1.0.2-rc01
(на момент написания), то я могу предложить переопределить onBackPressed()
в вашей активности хоста и вызватьonFinish()
и он в основном выйдет из приложения.Это то, что вы уже делаете.Но недостатком было бы то, что нажатие на любой экран в этом потоке навигационных графиков приведет к выходу из приложения, если только вы не выполняете пользовательские проверки, чтобы вызывать onFinish()
, только когда источником был экран входа в систему.Таким образом, чтобы иметь нестандартную навигацию на уровне фрагментов, Android хочет, чтобы мы использовали OnBackPressListener
.
Кроме того, в случае onBackPressed
или onOptionsItemSelected
, если вы хотите реализовать пользовательское поведениеосновываясь на отдельных экранах, вы можете сделать это, используя пункт назначения.
val currentScreenLabel = navController.currentDestination?.label
currentScreenLabel?.let {
if (it.contains("Login")) {
navController.navigateUp(appBarConfiguration)
}
}