经二次测试有效:转:清空Fragment回退栈中某个Fragment之上的所有Fragment
之前设置了addbackStack(null)
连续点击了6次fragment,保存了6个回退栈,然后点击返回,直接清空所有栈并且onDetach掉回到上一个fragment;
结果:这里打印的getName为null,所以下面的设置参数1:就直接设置null了
com.demo.moviedemo E/Fragment Two-vvv: ++++++++++++Fragment回退栈数量:6
com.demo.moviedemo E/Fragment Two-vvv: null
这是我点击返回时候执行:
mBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//查看栈的清空,看最底下的栈的Name
int num = getActivity().getFragmentManager().getBackStackEntryCount();
String numString = "++++++++++++++++Fragment回退栈数量:"+num;
Log.e("Fragment Two-vvv", numString);
for (int i = 0; i < num; i++) {
android.app.FragmentManager.BackStackEntry f = getActivity().getFragmentManager().getBackStackEntryAt(i);
Log.e("Fragment Two-vvv", f.getName()+"");
}
//清空回退栈的重要一步 根据Name来清空上层的栈
getActivity().getFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);
onDetach();
}
});
以下是详细流程:
根据debug信息查看Fragment回退栈的情况,具体debug代码如下:
int num = getActivity().getSupportFragmentManager().getBackStackEntryCount();
String numString = "++++++++++++++++++++++++++++++++++Fragment回退栈数量:"+num;
TALogger.d("Fragment", numString);
for (int i = 0; i < num; i++) {
BackStackEntry backstatck = getActivity().getSupportFragmentManager().getBackStackEntryAt(i);
TALogger.d("Fragment", backstatck.getName());
}
debug结果截图如下:
最后一步是调用:
getActivity().getSupportFragmentManager().popBackStackImmediate(CreateGroupNameFragment.class.getName(), FragmentManager.POP_BACK_STACK_INCLUSIVE);
即弹出Tag为CreateGroupNameFragment之上的所有(包括自身)的Fragment。
popBackStackImmediate(name,flag);
第一个参数:是最底下fragment的名称,一般是类名
具体情况根据打印出来的名字决定,有时候为getName为nul,name就填null
第二个参数:只能是 0 或者 1(POP_BACK_STACK_INCLUSIVE);
第一个参数为null时,第二个参数为0时:
会弹出回退栈中最上层的那一个fragment。
因为经测试,回退栈中的fragment个数减少了一个。
第二个参数为1时:
会弹出所有回退栈中的fragment。
因为经测试,回退栈中的fragment个数变为0了。