i后面堆栈 a,b,c 中有以下片段。然后,我想添加fragment d ,但是在后堆栈中,我想放置 a和d ,而不是 a,b,c,c,d 问题是当我尝试使用transaction.remove()
删除B和C时,backStackEntryCount
仍然是旧的,它在向后压时会制成空屏幕。有办法处理此操作吗?
当我使用 popBackStack()
时,它将变成片段a,然后d,这会产生怪异的动画效果。
编辑:这个问题并不是重复的,因为这个问题更多地是为了控制背堆中几个片段的顺序。
在添加到背面时,您可以在处于特定状态时包含一个名称以弹出背面堆栈。基于FragmentManager#popbackstack(String,int)的文档;:
将最后一个片段从经理的片段背面堆栈播放。如果没有什么可弹出的,则返回错误。此功能是异步的 - 它引起了弹出请求的启用,但是直到应用程序返回其事件循环之前,该操作将不会执行。
。参数
name 字符串:如果非编号,这是要查找的先前后背状态的名称;如果发现,到该州的所有状态都将被弹出。POP_BACK_STACK_INCLUSIVE FLAG可用于控制命名状态本身是否弹出。如果null,只有最高状态就会弹出。
flags int :0或pop_back_stack_inclusiver。
所以在这种情况下,您:
将片段a添加到容器和根背面。给它一个名字,以便您可以在弹出时引用它。
fragment a :
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction()
.replace(R.id.fragment_container, FragmentA, "FragmentA")
.addToBackStack("first")
.commit();
将片段B添加到容器中(更换或添加,没关系)。用" null"添加到背包中如果您愿意,或其他名称。它必须不同于"第一"。
fragment b :
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction()
.replace(R.id.fragment_container, FragmentB, "FragmentB")
.addToBackStack(null)
.commit();
像片段一样添加或替换为片段c。
fragment c :
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction()
.replace(R.id.fragment_container, FragmentC, "FragmentC")
.addToBackStack(null)
.commit();
像片段b和c。
fragment d :
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction()
.replace(R.id.fragment_container, FragmentD, "FragmentD")
.addToBackStack(null)
.commit();
然后,在onBackPressed()
中,您首先检查" fragmentd"在堆栈中。如果是这样,请一直弹出回到根部(在这种情况下是"第一")。如果没有,只需像平常地一样处理后面。
@Override
public void onBackPressed() {
FragmentManager fm = getFragmentManager();
if (fm.findFragmentByTag("FragmentD") != null) {
fm.popBackStack("first", 0); // Pops everything up to "first"
} else {
super.onBackPressed(); // Pops backstack like normal or leaves App if at base.
}
}
这应该做的是允许您的用户回去。当他们按下片段A,B或C中的背部按钮时,然后当它们最终在片段D中时,它将一直弹出回到A。
fragment a
FragmentManager fragmentManager = getFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.replace(R.id.fragment_container, FragmentA, "FragmentA");
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
片段b
fragmentTransaction.replace(R.id.fragment_container, FragmentB, "FragmentB");
片段C
fragmentTransaction.replace(R.id.fragment_container, FragmentC, "FragmentC");
片段d
fragmentTransaction.replace(R.id.fragment_container, FragmentD, "FragmentD");
现在您的onbackpressed()在活动中
@Override
public void onBackPressed() {
int lastStack = getSupportFragmentManager().getBackStackEntryCount();
try {
//If the last fragment was named/tagged "three"
if (getSupportFragmentManager().getFragments().get(lastStack).getTag().toString()=="FragmentD"){
getSupportFragmentManager().popBackStackImmediate();//skip c
getSupportFragmentManager().popBackStackImmediate();//skip B
Fragment fragment = getSupportFragmentManager().findFragmentByTag("FragmentA");
FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.fragment_container, fragment);
transaction.commit();
return;
}
} catch (Exception e) {
e.printStackTrace();
}
super.onBackPressed();
}
为每个片段制作fragment_container,并继续替换最新片段的fragment_container ..不要忘记:
addToBackStack(null);