1

我在后堆栈A, B, C中有以下片段。然后我想添加片段D,但在后面的堆栈中我想放A 和 D而不是A, B, C, D。问题是当我尝试用 删除 B 和 C 时transaction.remove()backStackEntryCount仍然是旧的,在按回时会出现空白屏幕。有没有办法处理这个?

当我使用popBackStack()它时,它会转到片段 A,然后是 D,​​这会产生奇怪的动画效果。

编辑:问题不是重复的,因为它被标记了,因为这个问题更多的是控制后堆栈中几个片段的顺序。

4

3 回答 3

1

添加到 Backstack 时,您可以包含一个名称,以便在您处于特定状态时将 backstack 弹出到。基于FragmentManager#popBackStack(string, int);的文档

从管理器的片段返回堆栈中弹出最后一个片段转换。如果没有要弹出的内容,则返回 false。该函数是异步的——它将要弹出的请求排入队列,但直到应用程序返回其事件循环后才会执行该操作。

参数

name String:如果非空,这是要查找的先前返回状态的名称;如果找到,将弹出该状态之前的所有状态。POP_BACK_STACK_INCLUSIVE 标志可用于控制命名状态本身是否被弹出。如果为 null,则仅弹出顶部状态。

flags int:0 或 POP_BACK_STACK_INCLUSIVE。

所以在这种情况下,你:

将片段 A 添加到容器和根 backstack。给它一个名字,这样你可以在弹出时引用它。

片段 A

FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction()
.replace(R.id.fragment_container, FragmentA, "FragmentA")
.addToBackStack("first")
.commit();

将 Fragment B 添加到容器中(替换或添加,没关系)。如果您愿意,可以使用“null”或其他名称添加到 backstack。它必须不同于“第一”。

片段 B

FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction()
.replace(R.id.fragment_container, FragmentB, "FragmentB")
.addToBackStack(null)
.commit();

像使用 Fragment B 一样添加或替换 Fragment C。

片段 C

FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction()
.replace(R.id.fragment_container, FragmentC, "FragmentC")
.addToBackStack(null)
.commit();

像使用 Fragment B 和 C 一样添加或替换 Fragment D。

片段 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。

于 2016-11-22T15:47:43.717 回答
0

片段 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();
 }
于 2016-11-22T14:36:50.237 回答
-1

为每个片段制作片段容器并继续替换最新片段的片段容器..不要忘记:

addToBackStack(null);
于 2016-11-22T15:29:24.127 回答