我将自己的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);
    }
}

其他回答

只需使用此方法并传递Context & Fragment标签,我们需要删除背桩片段。

使用

clearFragmentByTag(context, FragmentName.class.getName());



public static void clearFragmentByTag(Context context, String tag) {
    try {
        FragmentManager fm = ((AppCompatActivity) context).getSupportFragmentManager();

        for (int i = fm.getBackStackEntryCount() - 1; i >= 0; i--) {
            String backEntry = fm.getBackStackEntryAt(i).getName();
            if (backEntry.equals(tag)) {
                break;
            } else {
                 fm.popBackStack();
            }
        }
    } catch (Exception e) {
        System.out.print("!====Popbackstack error : " + e);
        e.printStackTrace();
    }
}
    private void clearBackStack(){
        SupportFragmentManaer fm = getSupportFragmentManager();
        fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }

调用这个方法会非常简洁。

不需要循环。 如果你在片段中使用动画,它不会显示太多动画。但是使用循环会。

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

Use:

fragmentManager.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

我让它这样工作:

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

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

fragmentManager.popBackStackImmediate(0, FragmentManager.POP_BACK_STACK_INCLUSIVE);

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

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

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