【发布时间】:2020-10-21 05:54:32
【问题描述】:
我的应用程序中的默认路由是 - Auth -> Main -> Chat。但有时我需要使用另一条路线:Auth -> Details -> Chat。当我按下后退按钮(在这两种情况下)时,我想导航到Main 屏幕,但在第二种情况下它不在后台堆栈中。我尝试创建Global-action 以使用popUpTo == Main 从Details 屏幕导航到Chat:
<action
android:id="@+id/action_global_to_chat"
app:destination="@id/navigation_chat"
app:launchSingleTop="true"
app:popUpTo="@id/navigation_main_host" />
但它不起作用,因为navigation_main_host 不在后台堆栈中。有没有办法得到这种行为?
UPD:我尝试了另一种解决方案 - 我在 Chat 目标中创建了另一个动作,其行为为 popup inclusive:
<action
android:id="@+id/action_chat_to_main_host"
app:destination="@id/navigation_main_host"
app:popUpTo="@id/navigation_auth"
app:popUpToInclusive="true" />
然后我尝试在我的ChatFragment 中使用它:
private val backPressedCallback = object : OnBackPressedCallback(true) {
override fun handleOnBackPressed() {
if (activityController?.getNavController()?.previousBackStackEntry?.destination?.id == R.id.navigation_main_host) {
activityController?.getNavController()?.popBackStack()
} else {
activityController?.getNavController()?.navigate(ChatDirections.actionChatToMainHost())
}
}
}
但是当我尝试它时,我得到了这条路线:
Auth -> Details -> Chat
然后我开始按下返回按钮:
Chat -> Main -> Chat -> Main -> Chat -> Main....在无限循环中。
backPressedCallback 在onResume 中启用,在onPause 中禁用以明确说明。
【问题讨论】:
-
@Abhimanyu 你到底想在这个页面上给我看什么?我已阅读,但我的问题没有答案。
-
我认为这是您的用例。如果我遗漏了什么,请告诉我。您希望您的应用程序处理打开特定屏幕(聊天屏幕)的意图。当用户按下后退按钮时,他们会向后导航导航堆栈,就像他们从入口点进入您的应用一样。
-
@Abhimanyu 我编辑了我的问题并删除了令人困惑的部分。请看一看。
-
要确认,一旦你在“聊天”屏幕上,按回应该总是导航到“主”屏幕?
标签: android navigation back-stack