カスタム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()
}
リフレクションなしでこれを行う方法はありますか?
開始宛先のIDと現在の宛先のIDを比較できます。何かのようなもの:
override fun onBackPressed() = when {
navController.graph.startDestination == navController.currentDestination?.id -> showQuitDialog()
else -> super.onBackPressed()
}
それが役に立てば幸い。
これを任意の目的地で試してください(目的地IDはナビゲーショングラフで確認できます)。
`
private fun isDesiredDestination(): Boolean {
return with(navController) {
currentDestination == graph[R.id.yourDestinationId]
}
}
`