我有一个问题,我过去几天一直在处理,而且似乎没有找到答案。
描述:我有一个包含导航抽屉的主要活动。导航抽屉的每个项目(单击时)都会创建一个片段。在该片段中,有一个对象的listView,在单击时会创建其他片段。在那些片段中,我有另一个列表视图对象打开其他片段。换句话说,有一系列打开其他片段的片段。像这样:
http://s22.postimg.org/pddo5gsv5/backstack.png
为了能够回到每个片段,我实现了addToBackstack(" string")方法。
我的问题是,如何为我的应用程序实现正确的backstack,以便当我单击导航Drawer项目时,已经添加到backstack的所有片段都被清除,而没有导航Drawer项目打开的那些。
任何帮助将不胜感激。谢谢!
修改
好吧,似乎我设法搞清楚了。考虑到我从回复中得到的建议,我提出了解决方案:
@Override
public void onBackPressed() {
int count = getFragmentManager().getBackStackEntryCount();
if (count != 0) {
FragmentManager.BackStackEntry backEntry = getFragmentManager()
.getBackStackEntryAt(
getFragmentManager().getBackStackEntryCount() - 1);
if (backEntry.getName() == NAVIGATION) {
finish();
} else
getFragmentManager().popBackStack();
} else {
super.onBackPressed();
}
}
用文字说:首先,我为顶级片段添加了一个backstack条目,给它们一个特定的标签。我已经覆盖了Activity的后退按钮功能,这样当最后一个backstack条目是一个顶级片段来完成活动时(这样它就不会简单地将片段从活动中分离出来,将其视为空)。否则,如果最后一个条目不是顶级片段,则执行popBackStack。 PS:所有非顶级片段都添加到backstack,使用不同的标签,然后是顶级片段。此外,我必须在导航抽屉的点击监听器中执行POP_BACK_STACK_INCLUSIVE。
getFragmentManager().popBackStack(null,
FragmentManager.POP_BACK_STACK_INCLUSIVE);
谢谢大家的建议,希望这个EDIT可以帮助其他用户。
答案 0 :(得分:2)
您可以使用以下代码解决问题:
getFragmentManager().beginTransaction()
.replace(R.id.fragment_container, fragment)
.addToBackStack(fragment_tag)
.commit();
为了使上面的代码工作,您必须动态创建片段。由于硬编码片段无法替换。为此,您可以创建一个容器(FrameLayout等),在我们的示例中具有id fragment_container 。然后,上面的代码将动态地在容器中添加片段。最后,您必须在 addToBackStack 方法中将 fragment_tag 作为参数传递。这意味着,此事务将添加到后台堆栈中。最后,为了从后台堆栈中获取它,您必须使用以下代码:
getFragmentManager().popBackStack(fragment_tag, FragmentManager.POP_BACK_STACK_INCLUSIVE));
POP_BACK_STACK_INCLUSIVE标志确保“所有匹配的条目将被消耗,直到找到不匹配的条目或达到堆栈的底部。否则,将删除所有条目,但不包括该条目。”
答案 1 :(得分:0)
您可以使用以下内容清除片段backstack:
fragmentManager.popBackStack("string", FragmentManager.POP_BACK_STACK_INCLUSIVE);
然后您可以像往常一样addToBackstack
和commit
。 More info
一个代码段,显示我在导航抽屉中通常使用它的方式:
FragmentManager fragmentManager = getSupportFragmentManager();
if(clearBackStack) {
fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
FragmentTransaction ft = fragmentManager.beginTransaction();
ft.replace(R.id.content_frame, fragment);
if(!clearBackStack) {
ft.addToBackStack(null);
}
ft.commit();