我有一个应用程序,我有3个主屏幕。
1)主页
2)网格视图
3)流视图
我的流量是:
使用菜单选项时,一切都很好。我有以下代码:
主视图到网格视图(将主视图添加到后台堆栈)
getFragmentManager().beginTransaction()
.replace(R.id.container, gridFragment)
.addToBackStack(gridFragment.getTag())
.commit();
网格到流(不要将网格视图添加到后台堆栈)。流到网格视图是类似的。
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)是否有更简单,更清洁的方式来做我想做的事情?
答案 0 :(得分:0)
使用class.tostring(),这不会返回类名,而是字符串中的某种对象ID。所以改为使用 class.getSimpleName()....这将给出类名,并且代码中的if检查可能有效。
另外我的建议是使用带有标签而不是片段交易的视图寻呼机,因为它更易于处理和维护。