我遇到了解决此问题的问题。
基本上我的ActionBar中有很多标签。触摸每个片段时,前一个选项卡中的片段将被分离,新选项卡的片段将使用replace(如果尚未实例化)或附加(如果有)添加。我想我从谷歌那里获得了这种方法,直到现在它才能正常工作。
添加标签片段的示例:
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。如果有必要,我可以在那里做相反的事情。
感谢您的帮助,如果我语无伦次,请对不起。
答案 0 :(得分:0)
不确定这是否有资格作为解决方案,但我最终只是没有将事务添加到后台堆栈,只是在用户滑动或按下时执行新的事务。该交易刚刚与动画等相反。
我管理后退按钮的方法是,如果我在显示Panel C的布局中,我将布尔值设置为true。如果用户滑回Panel A布局或导航,则布尔值设置为false。然后我重写了Activity中的onBackButtonPressed方法,如果布尔值为true(即:我们在Panel C布局中)我运行反向事务,否则我只调用super.onBackButtonPressed()(即:执行标准后退按钮行为)