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

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


当前回答

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

fragmentManager.popBackStackImmediate(0, FragmentManager.POP_BACK_STACK_INCLUSIVE);

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

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

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

其他回答

只需使用此方法并传递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();
    }
}

这对我很有效,试试这个:

public void clearFragmentBackStack() {
        FragmentManager fm = getSupportFragmentManager();
        for (int i = 0; i < fm.getBackStackEntryCount() - 1; i++) {
            fm.popBackStack();
        }
    }

我在这里发布了类似的内容

来自约阿希姆的回答,来自Dianne Hackborn:

http://groups.google.com/group/android-developers/browse_thread/thread/d2a5c203dad6ec42

最后我只用了:

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

但同样可以使用类似的东西:

((AppCompatActivity)getContext()).getSupportFragmentManager().popBackStack(String name, 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;
}
    private void clearBackStack(){
        SupportFragmentManaer fm = getSupportFragmentManager();
        fm.popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
    }

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

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