我将自己的Android应用移植到honeycomb上,为了使用fragments,我做了一次大的重构。在我以前的版本中,当我按下Home按钮时,我用来执行ACTIVITY_CLEAR_TOP以重置back堆栈。
现在我的应用程序只是一个具有多个片段的单个活动,所以当我按下Home按钮时,我只是替换其中一个片段。我如何才能清除我的后台堆栈,而不必使用startActivity与ACTIVITY_CLEAR_TOP标志?
我将自己的Android应用移植到honeycomb上,为了使用fragments,我做了一次大的重构。在我以前的版本中,当我按下Home按钮时,我用来执行ACTIVITY_CLEAR_TOP以重置back堆栈。
现在我的应用程序只是一个具有多个片段的单个活动,所以当我按下Home按钮时,我只是替换其中一个片段。我如何才能清除我的后台堆栈,而不必使用startActivity与ACTIVITY_CLEAR_TOP标志?
当前回答
只需使用此方法并传递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);
}
调用这个方法会非常简洁。
不需要循环。 如果你在片段中使用动画,它不会显示太多动画。但是使用循环会。
清除无循环的backstack
String name = getSupportFragmentManager().getBackStackEntryAt(0).getName();
getSupportFragmentManager().popBackStack(name, FragmentManager.POP_BACK_STACK_INCLUSIVE);
addToBackStack()参数的名称在哪里
getSupportFragmentManager().beginTransaction().
.replace(R.id.container, fragments.get(titleCode))
.addToBackStack(name)
嗨~我找到了一个更好的解决方案,来自: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);
}
}
我在这里发布了类似的内容
来自约阿希姆的回答,来自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)
这将弹出所有的状态到指定的一个。然后你可以用你想要的东西替换这个片段
只需使用此方法并传递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();
}
}