web-dev-qa-db-ja.com

Androidナビゲーションアーキテクチャで、現在のフラグメントが最後のものであるかどうかを確認するにはどうすればよいですか?

カスタムAlertDialogを表示する必要がありますが、NavController.navigateUp()を呼び出した後、フラグメントがなくなった場合のみです。私の現在のコードは同様のことをしていますが、バグがあります:

override fun onBackPressed() {

    if (navController.navigateUp()) {
        return
    }

    showQuitDialog()
}

これは多少は機能しますが、AlertDialogをキャンセルしてアプリを終了しない場合、navControllerはすでにNavGraphルートまでナビゲートしましたが、これは私がいたフラグメントではありませんAlertDialogが出現したとき。そのため、そのフラグメントのナビゲーションアクションを使用しようとすると、エラーが発生します。

Java.lang.IllegalArgumentException:ナビゲーションの宛先com.example.test/actionNavigateToNextFragmentはこのNavControllerに認識されていません

mBackStackNavControllerフィールドにアクセスできれば、これは解決できますが、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()
}

リフレクションなしでこれを行う方法はありますか?

6
xinaiz

開始宛先のIDと現在の宛先のIDを比較できます。何かのようなもの:

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

それが役に立てば幸い。

12

これを任意の目的地で試してください(目的地IDはナビゲーショングラフで確認できます)。
`

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

`

1
Manzur Alahi