如何在后堆中用另一个片段替换一个以上的片段



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);

最新更新