我在后堆栈A, B, C中有以下片段。然后我想添加片段D,但在后面的堆栈中我想放A 和 D而不是A, B, C, D。问题是当我尝试用 删除 B 和 C 时transaction.remove()
,backStackEntryCount
仍然是旧的,在按回时会出现空白屏幕。有没有办法处理这个?
当我使用popBackStack()
它时,它会转到片段 A,然后是 D,这会产生奇怪的动画效果。
编辑:问题不是重复的,因为它被标记了,因为这个问题更多的是控制后堆栈中几个片段的顺序。
我在后堆栈A, B, C中有以下片段。然后我想添加片段D,但在后面的堆栈中我想放A 和 D而不是A, B, C, D。问题是当我尝试用 删除 B 和 C 时transaction.remove()
,backStackEntryCount
仍然是旧的,在按回时会出现空白屏幕。有没有办法处理这个?
当我使用popBackStack()
它时,它会转到片段 A,然后是 D,这会产生奇怪的动画效果。
编辑:问题不是重复的,因为它被标记了,因为这个问题更多的是控制后堆栈中几个片段的顺序。
添加到 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。
片段 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();
}
为每个片段制作片段容器并继续替换最新片段的片段容器..不要忘记:
addToBackStack(null);