【发布时间】:2019-11-13 21:15:17
【问题描述】:
我有一个FragmentActivity(称为“QuizActivity”),用户在其中浏览一系列问题片段,进行测验。一旦他们到达测验的结尾,他们就会转换到一个显示测验分数的片段(仍在 QuizActivity 中)。从那里,我想给用户一个按钮,让他们回到他们开始 QuizActivity 之前的活动。我确实不希望这个按钮或后退按钮只是弹出后退堆栈,这会使用户回到他们刚刚完成的测验的问题中。
如果QuizActivity 只是一个Activity 而不是FragmentActivity,我可以调用Activity.onBackPressed() 将QuizActivity 从后面的堆栈中弹出。但是QuizActivity 是FragmentActivity,而FragmentActivity.onBackPressed() 会从后台堆栈中弹出片段,一次一个。
FragmentManager.popBackStack(id or name, POP_BACK_STACK_INCLUSIVE) 应该能够做我想做的事,如果我能找到 QuizActivity 中第一个片段的 id 或名称。我怎么找到那个?第一个片段使用导航 XML 文件导航到。如果第一个片段位于 XML 导航文档中,如何设置第一个片段的名称(以便我可以弹回它,包括在内)? android:name 属性设置片段类,而不是 popBackStack 会查找的名称,我相信。我使用android:label 吗?
或者我如何确定ID?它是 XML 导航文档中 android:id 属性的整数值 (R.id.myFragment) 吗? documentation for popBackStack(id, flags) 表示“标识符是 FragmentTransaction.commit() 返回的数字。”但是由于我没有使用FragmentTransaction.commit(),所以ID是什么?
我尝试使用FragmentManager.getBackStackEntryCount()、getBackStackEntryAt(i) 和BackStackEntry.getName() 检查后台堆栈以查找ID 和名称。但是条目计数始终为零!当明显有一个 backStack 时,我不明白这是怎么发生的:按下后退按钮会使我在前面的片段中向后移动(测验问题)。
【问题讨论】:
-
为什么不让按钮开始一个新的意图以转到所需的活动?您可以在意图中添加额外内容以跟踪它们所处的状态
-
听起来你想弹出整个活动,对吗?这就是
finish()Activity API 的作用。你不这样做有什么原因吗? -
@Quinn 我考虑过这一点,但我怎么知道要回到哪个活动?他们可能从几个不同的地方来参加当前的活动。
-
@ianhanniballake 是的,你是对的。 ??? (虽然我仍然想知道为什么
FragmentManager.getBackStackEntryCount()给出的值为零。) -
如果您使用 Navigation,则返回堆栈位于
NavHostFragment的childFragmentManager中,而不是 Activity 的 FragmentManager。
标签: android fragment-backstack