我将自己的Android应用移植到honeycomb上,为了使用fragments,我做了一次大的重构。在我以前的版本中,当我按下Home按钮时,我用来执行ACTIVITY_CLEAR_TOP以重置back堆栈。

现在我的应用程序只是一个具有多个片段的单个活动,所以当我按下Home按钮时,我只是替换其中一个片段。我如何才能清除我的后台堆栈,而不必使用startActivity与ACTIVITY_CLEAR_TOP标志?


当前回答

我让它这样工作:

public void showHome() {
    getHandler().post(new Runnable() {
        @Override
        public void run() {
            final FragmentManager fm = getSupportFragmentManager();
            while (fm.getBackStackEntryCount() > 0) {
                fm.popBackStackImmediate();
            }
        }
    });
}

其他回答

工作为我和简单的方法不使用循环:

 FragmentManager fragmentManager = getSupportFragmentManager();
 //this will clear the back stack and displays no animation on the screen
 fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

在尊重所有相关方的前提下;我非常惊讶地看到你们中有多少人可以用一个简单的方法清除整个片段返回堆栈

调频。popBackStack (null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

根据Android文档(关于name参数-在声称的工作建议中的“null”)。

如果为空,则只弹出顶部状态

现在,我确实意识到我对你的特定实现缺乏了解(比如在给定的时间点你在后台堆栈中有多少项),但当我期待在更广泛的设备和供应商上有良好定义的行为时,我会把我所有的钱都押在公认的答案上:

(作为参考,和这个一起)

FragmentManager fm = getFragmentManager(); // or 'getSupportFragmentManager();'
int count = fm.getBackStackEntryCount();
for(int i = 0; i < count; ++i) {    
    fm.popBackStack();
}

为@Warpzit的评论做一个回答,让其他人更容易找到。

Use:

fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

嗨~我找到了一个更好的解决方案,来自:https://gist.github.com/ikew0ng/8297033

    /**
 * Remove all entries from the backStack of this fragmentManager.
 *
 * @param fragmentManager the fragmentManager to clear.
 */
private void clearBackStack(FragmentManager fragmentManager) {
    if (fragmentManager.getBackStackEntryCount() > 0) {
        FragmentManager.BackStackEntry entry = fragmentManager.getBackStackEntryAt(0);
        fragmentManager.popBackStack(entry.getId(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }
}

接受的答案对我来说是不够的。我不得不使用:

FragmentManager fm = getSupportFragmentManager();
int count = fm.getBackStackEntryCount();
for(int i = 0; i < count; ++i) {
    fm.popBackStackImmediate();
}