我将自己的Android应用移植到honeycomb上,为了使用fragments,我做了一次大的重构。在我以前的版本中,当我按下Home按钮时,我用来执行ACTIVITY_CLEAR_TOP以重置back堆栈。
现在我的应用程序只是一个具有多个片段的单个活动,所以当我按下Home按钮时,我只是替换其中一个片段。我如何才能清除我的后台堆栈,而不必使用startActivity与ACTIVITY_CLEAR_TOP标志?
我将自己的Android应用移植到honeycomb上,为了使用fragments,我做了一次大的重构。在我以前的版本中,当我按下Home按钮时,我用来执行ACTIVITY_CLEAR_TOP以重置back堆栈。
现在我的应用程序只是一个具有多个片段的单个活动,所以当我按下Home按钮时,我只是替换其中一个片段。我如何才能清除我的后台堆栈,而不必使用startActivity与ACTIVITY_CLEAR_TOP标志?
当前回答
private void clearBackStack(){
SupportFragmentManaer fm = getSupportFragmentManager();
fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
}
调用这个方法会非常简洁。
不需要循环。 如果你在片段中使用动画,它不会显示太多动画。但是使用循环会。
其他回答
这对我很有效,试试这个:
public void clearFragmentBackStack() {
FragmentManager fm = getSupportFragmentManager();
for (int i = 0; i < fm.getBackStackEntryCount() - 1; i++) {
fm.popBackStack();
}
}
接受的答案对我来说是不够的。我不得不使用:
FragmentManager fm = getSupportFragmentManager();
int count = fm.getBackStackEntryCount();
for(int i = 0; i < count; ++i) {
fm.popBackStackImmediate();
}
private boolean removeFragFromBackStack() {
try {
FragmentManager manager = getSupportFragmentManager();
List<Fragment> fragsList = manager.getFragments();
if (fragsList.size() == 0) {
return true;
}
manager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}
我只想补充一点:——
使用下面的方法从后台弹出
fragmentManager.popBackStack()
只是从交易中删除片段,不可能从屏幕上删除片段。 理想情况下,你可能看不见,但可能有两三个片段堆叠在一起,按下后退键UI可能看起来很杂乱,堆叠。
举个简单的例子:-
假设你有一个fragmentA,它使用fragmentmanager.replace()加载Fragmnet B,然后我们执行addToBackStack来保存这个事务。 所以流程是:——
step1 -> FragmentA->FragmentB(我们移动到FragmentB,但FragmentA在背景中,不可见)。
现在你在fragmentB中做了一些工作,并按下Save按钮——保存后应该回到fragmentA。
在FragmentB保存时,我们返回FragmentA。
常见的错误是……在Fragment B中,我们将执行Fragment Manager.replace() fragmentB与fragmentA。
但实际发生的是,我们再次载入片段A,取代片段b。所以现在有两个FragmentA(一个来自step1,一个来自step3)。
FragmentsA的两个实例堆叠在一起,它们可能不可见,但确实存在。
因此,即使我们通过上述方法清除了后台堆栈,也会清除事务,但不会清除实际的片段。 所以理想情况下,在按下保存按钮时,你只需要通过简单地执行fm.popBackStack()或fm.popBackImmediate()返回fragmentA。
所以纠正Step3-> fm.popBackStack()回到fragmentA,它已经在内存中了。
我让它这样工作:
public void showHome() {
getHandler().post(new Runnable() {
@Override
public void run() {
final FragmentManager fm = getSupportFragmentManager();
while (fm.getBackStackEntryCount() > 0) {
fm.popBackStackImmediate();
}
}
});
}