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

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


当前回答

我只想补充一点:——

使用下面的方法从后台弹出

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,它已经在内存中了。

其他回答

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

来自约阿希姆的回答,来自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)

这将弹出所有的状态到指定的一个。然后你可以用你想要的东西替换这个片段

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

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

我只想补充一点:——

使用下面的方法从后台弹出

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,它已经在内存中了。

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

这里的kotlin人

repeat(supportFragmentManager.backStackEntryCount) {
    supportFragmentManager.popBackStack()
}