使用动态 navGraph startDestination 从 backstack 中删除片段
Removing a fragment from backstack with a dynamic navGraph startDestination
我有一个带有 navGraph 的 Activity,它在创建 Activity 时有条件地选择 startDestination。
private suspend fun checkStatusAndNavigate(userID: Int) {
val navController = findNavController(nav_host_container)
val user = getUserFromDB(userID)
val dateNow = Date((if (prefSaved) prefTime() else System.currentTimeMillis())
val navGraph = navController.navInflater.inflate(nav_graph).apply {
// NavGraph inflates with one of three possible starting points: A, B, or C.
startDestination = when {
checkDate(dateNow) == DateCheck.OldDate -> R.id.fragment_a
!user.hasOptedIn -> R.id.fragment_b
else -> R.id.fragment_c
}
}
navController.setGraph(navGraph)
}
在navController.setGraph(navGraph)
之后启动startDestination。这按预期工作。
片段 B 的唯一目的地是片段 C。但是当用户在片段 C 中并执行 onBackPressed() 时,我想跳过片段 B,return 到任何所谓的 Activity(有几个选项,所以覆盖 onBackPressed 不是一个很好的选择)。
我认为这不是 popTo 或 popToInclusive 问题。我不想清除后台。如果可能的话,我只想阻止片段 B 进入后台堆栈。
如果您不希望从 C 返回访问 B,那么您应该创建一个 popTo=B
、popToInclusive=true
和 destination=C
的操作。
我有一个带有 navGraph 的 Activity,它在创建 Activity 时有条件地选择 startDestination。
private suspend fun checkStatusAndNavigate(userID: Int) {
val navController = findNavController(nav_host_container)
val user = getUserFromDB(userID)
val dateNow = Date((if (prefSaved) prefTime() else System.currentTimeMillis())
val navGraph = navController.navInflater.inflate(nav_graph).apply {
// NavGraph inflates with one of three possible starting points: A, B, or C.
startDestination = when {
checkDate(dateNow) == DateCheck.OldDate -> R.id.fragment_a
!user.hasOptedIn -> R.id.fragment_b
else -> R.id.fragment_c
}
}
navController.setGraph(navGraph)
}
在navController.setGraph(navGraph)
之后启动startDestination。这按预期工作。
片段 B 的唯一目的地是片段 C。但是当用户在片段 C 中并执行 onBackPressed() 时,我想跳过片段 B,return 到任何所谓的 Activity(有几个选项,所以覆盖 onBackPressed 不是一个很好的选择)。
我认为这不是 popTo 或 popToInclusive 问题。我不想清除后台。如果可能的话,我只想阻止片段 B 进入后台堆栈。
如果您不希望从 C 返回访问 B,那么您应该创建一个 popTo=B
、popToInclusive=true
和 destination=C
的操作。