@trueblue 的回答让我解决了一个小而烦人的问题。当 backstack 上只有一个片段并且您按下后退按钮时,该帧将被删除,并且应用程序保持活动状态并显示空白屏幕。用户需要再按一次返回按钮才能退出应用程序。为了处理这种情况,我将原代码修改为如下
@Override
public void onBackPressed() {
if(getFragmentManager().getBackStackEntryCount() == 0) {
super.onBackPressed();
}
else if(getFragmentManager().getBackStackEntryCount() == 1) {
moveTaskToBack(false);
}
else {
getFragmentManager().popBackStack();
}
}
当backstack中只有1个fragment时,我们基本上是在告诉android将整个应用程序移到后面。
更新(可能是更好的答案)
因此,在对此进行了更多阅读之后,我发现您可以 add fragment manager transactions to back stack 然后 android 会自动以所需的方式处理后按。下面的代码 sn-p 显示了如何做到这一点
Fragment fragment; //Create and instance of your fragment class here
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, fragment).addToBackStack(null);
fragmentTransaction.commit();
fragmentTransaction.addToBackStack(null);
最后一行显示了如何将事务添加到后台堆栈。这解决了大多数情况下片段的后压问题,除了一个。如果您继续按返回按钮,那么最终您将到达一个点,即返回堆栈中只有一个片段。此时,您将想做两件事之一
- 从正在运行活动的任务的后台堆栈中删除包含该片段的活动。这是因为您不想以空白活动结束
- 如果该活动是该任务的后台堆栈中的唯一活动,则将该任务推入后台。
在我的情况下,是后者,所以我修改了之前答案中覆盖的 onBackPressed 方法,如下所示
@Override
public void onBackPressed() {
if(getFragmentManager().getBackStackEntryCount() == 1) {
moveTaskToBack(false);
}
else {
super.onBackPressed();
}
}
此代码更简单,因为它的逻辑更少,并且它依赖于框架而不是我们的自定义代码。不幸的是,我没有设法为第一种情况实现代码,因为我不需要。