我在想出解决此问题的方法时遇到问题。
基本上,我的 ActionBar 中有很多选项卡。当每个都被触摸时,前一个选项卡中的片段被分离,新选项卡的片段使用替换(如果它们还没有被实例化)或附加(如果它们有)添加。我想我从谷歌那里得到了这个方法,直到现在它工作得很好。
添加选项卡片段的示例:
if(tab.getText().equals(context.getString(R.string.title_class_tab))) {
if(browser == null) {
browser = CourseBrowserFragment.newInstance(false);
fragmentTransaction.replace(leftContainerId, browser);
} else {
fragmentTransaction.attach(browser);
}
if(lessonViewer == null) {
lessonViewer = LessonViewerFragment.newInstance(false);
fragmentTransaction.replace(rightContainerId, lessonViewer);
} else {
fragmentTransaction.attach(lessonViewer);
}
}
并删除:
if(tab.getText().equals(context.getString(R.string.title_class_tab))) {
if(browser != null) {
fragmentTransaction.detach(browser);
}
if(lessonViewer != null) {
fragmentTransaction.detach(lessonViewer);
}
}
问题来自我需要其中一个选项卡的布局。基本上它就像 Gmail 应用程序。有两个片段(假设面板 A 和面板 B),当您按下按钮面板 A 滑出时,面板 B 滑到面板 A 的旧位置,而新的第三个(面板 C)从右侧滑入。
我的工作正常,但现在我已将滑入 FragmentTransaction 添加到后退堆栈,以便用户可以触摸后退按钮,面板 C 将滑出,面板 A 将返回。同样,就像 Gmail。
除非用户转到不同的选项卡,否则此事务仍在后台堆栈中,并且如果用户按回则执行。碎片最终出现在疯狂的地方。我需要做的是当用户导航到不同的选项卡时将其从后台堆栈中删除。有什么办法可以做到这一点吗?FragmentManager 似乎不允许您手动从后台堆栈中删除内容,并且使用 popBackStack() 方法不仅会删除事务,还会执行它。我想在用户离开时将其删除,并在用户返回时将其放回。
我想我可以使用“getBackStackEntryAt”来获取该事务的“Back Stack Entry”,但如果我不能将其删除并在用户返回选项卡时将其放回原位,那就不好了。
我能想到的唯一可能的解决方案是不使用返回堆栈并覆盖 onBackButtonPressed 。如有必要,我可以从那里进行反向交易。
感谢您的帮助,如果我语无伦次,我们深表歉意。