【发布时间】:2015-07-20 18:32:59
【问题描述】:
我有一个应用程序,其中有 3 个主屏幕。
1) 主页
2) 网格视图
3) 流视图
我的流程是:
- 您可以从主页视图转到网格视图
- 您可以从网格视图转到流视图,反之亦然
- 当您想从流视图或网格视图返回时,您应该进入主视图。
当我使用菜单选项时,一切都很好。我有以下代码:
主页视图到网格视图(将主页视图添加到后台堆栈)
getFragmentManager().beginTransaction()
.replace(R.id.container, gridFragment)
.addToBackStack(gridFragment.getTag())
.commit();
网格到流(不要将网格视图添加到后台堆栈)。 Stream to Grid View 类似。
getFragmentManager().beginTransaction()
.replace(R.id.container, streamFragment)
.commit();
网格到主页。 Stream to Home 类似:
if (getFragmentManager().getBackStackEntryCount() > 0) {
getFragmentManager().popBackStack();
}
以上所有工作正常。现在要处理设备上的硬件后退按钮,我的 Activity 中有以下方法。
@Override
public void onBackPressed() {
if (getFragmentManager().getBackStackEntryCount() > 0) {
if (GlobalState.getCurrentFragment().class.getSimpleName().equals(
StreamFragment.class.getSimpleName())) {
clearBackStackAndChangeFragment(HomeFragment.newInstance());
} else if (GlobalState.getCurrentFragment().getClass().getSimpleName().equals(
GridFragment.class.getSimpleName())) {
clearBackStackAndChangeFragment(HomeFragment.newInstance());
} else {
getFragmentManager().popBackStack();
}
} else {
super.onBackPressed();
}
}
public void clearBackStackAndChangeFragment(Fragment fragment) {
FragmentManager fm = getFragmentManager();
fm.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
fm.beginTransaction().replace(R.id.container, fragment).commit();
}
当用户从 Home->Grid->Stream->...来回几次...->Home 通过硬件后退按钮时,我遇到了一个问题,即顶部菜单操作栏添加了来自 Grid/Stream 视图的项目。看起来我在处理片段事务时做错了什么。
1) 我做错了什么?
2) 有没有更简单、更干净的方法来做我想做的事?
【问题讨论】:
标签: android android-fragments android-actionbar