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

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


当前回答

嗨~我找到了一个更好的解决方案,来自: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);
    }
}

其他回答

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

调频。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();
}

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

 FragmentManager fragmentManager = getSupportFragmentManager();
 //this will clear the back stack and displays no animation on the screen
 fragmentManager.popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
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;
}

嗨~我找到了一个更好的解决方案,来自: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);
    }
}

阅读文档并研究片段id是什么,它似乎只是堆栈索引,所以这是可行的:

fragmentManager.popBackStackImmediate(0, FragmentManager.POP_BACK_STACK_INCLUSIVE);

0(0)是堆栈的底部,所以弹出到它包含清空堆栈。

警告:尽管上面的代码在我的程序中是有效的,但我还是有些犹豫,因为FragmentManager文档从来没有真正声明id是堆栈索引。这是有道理的,我所有的调试日志都表明它是,但也许在某些特殊情况下它不是?有人能证实这一点吗?如果是,那么以上是最好的解决方案。如果不是,这是另一种选择:

while(fragmentManager.getBackStackEntryCount() > 0) { fragmentManager.popBackStackImmediate(); }