Как в Android Navigation Architecture проверить, является ли текущий фрагмент последним? - PullRequest
0 голосов
/ 31 августа 2018

Мне нужно отобразить пользовательский AlertDialog, но только когда больше нет фрагментов после вызова NavController.navigateUp(). Мой текущий код делает что-то похожее, но есть ошибка:

override fun onBackPressed() {

    if (navController.navigateUp()) {
        return
    }

    showQuitDialog()
}

Это несколько работает, но если я отменю AlertDialog и не выйду из приложения, navController уже перешел к корню NavGraph, который не является фрагментом, в котором я находился, когда появился AlertDialog. Итак, если я пытаюсь использовать какое-либо действие навигации из этого фрагмента, я получаю ошибку:

java.lang.IllegalArgumentException: место назначения навигации com.example.test / actionNavigateToNextFragment неизвестен этому NavController

Эту проблему можно решить, если бы у меня был доступ к полю mBackStack в NavController, но это package private, и я не могу использовать отражение в моем текущем проекте. Но если бы это было public, я бы использовал его следующим образом:

override fun onBackPressed() {

    // 2 because first one is NavGraph, second one is last fragment on the stack
    if(navController.mBackStack.size > 2) { 
        navController.navigateUp()
        return
    }

    showQuitDialog()
}

Есть ли способ сделать это без отражения?

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Попробуйте это для любого пункта назначения (вы можете найти идентификатор пункта назначения на навигационной диаграмме):
`

private fun isDesiredDestination(): Boolean {
        return with(navController) {
            currentDestination == graph[R.id.yourDestinationId]
        }
    }

`

0 голосов
/ 30 октября 2018

Вы можете сравнить идентификатор начального пункта назначения с идентификатором текущего пункта назначения. Что-то вроде:

override fun onBackPressed() = when {
    navController.graph.startDestination == navController.currentDestination?.id -> showQuitDialog()
    else -> super.onBackPressed()
}

Надеюсь, это поможет.

...