【发布时间】:2015-01-21 16:41:09
【问题描述】:
过去几天我一直在处理一个问题,但似乎没有找到答案。
描述:我有一个包含导航抽屉的主要活动。导航抽屉的每个项目(单击时)都会创建一个片段。在该片段中,有一个对象列表视图,单击时会创建其他片段。在这些片段中,我有另一个打开其他片段的对象列表视图。换句话说,有一系列片段打开其他片段。像这样的:
http://s22.postimg.org/pddo5gsv5/backstack.png
为了能够返回到每个片段,我实现了 addToBackstack("string") 方法。
我的问题是,我怎样才能为我的应用程序实现正确的后台堆栈,以便当我单击导航抽屉项时,已添加到后台堆栈的所有片段都被清除,而导航抽屉项打开的片段没有。
任何帮助将不胜感激。谢谢!
编辑
好的,看来我设法弄明白了。考虑到我从回复中收到的建议,这是我想出的解决方案:
@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:所有非顶级片段都使用与顶级标签不同的标签添加到后台堆栈。此外,我必须在导航抽屉的点击监听器中执行 POP_BACK_STACK_INCLUSIVE。
getFragmentManager().popBackStack(null,
FragmentManager.POP_BACK_STACK_INCLUSIVE);
感谢大家的建议,希望此 EDIT 对其他用户有所帮助。
【问题讨论】:
-
我越来越多地使用抽屉布局,我认为
iosched示例应用程序做得最好。多个活动都有自己的内容片段和自己的带有预选部分的抽屉,因此您只使用活动堆栈而不必担心片段堆栈。 “这是我对你的智慧。”
标签: android listview android-fragments navigation-drawer back-stack