FragmentTransaction :: replace()有或没有addToBackStack()

时间:2015-11-03 20:29:42

标签: android android-fragments fragment-backstack

有一个流程来添加片段和后来的replace()片段。所有片段都是动态添加的,但不是全部调用addToBackStack()

getSupportFragmentManager().beginTransaction()
    .add(R.id.frgment_holder, frgmtA, frgmtA.NAME)
    .commit();

并且在某个地方可以添加另一个,例如:

getSupportFragmentManager().beginTransaction()
    .replace(R.id.frgment_holder, frgmtB)
    .addToBackStack(frgmtB.NAME)
    .commit();

带有frgmtB的replace()将从容器R.id.frgment_holder中删除frgmtA。 如果在此状态下按回按钮,它将弹出frgmtB。但它会重新创建frgmtA,即使它在添加时没有调用addToBackStack()吗?

如果在将片段添加到同一个容器中并且串行混合add()和replace()调用,而有人调用addToBackStack()但有人没有,那么后退按钮的行为如何?

编辑: 之后

getSupportFragmentManager().beginTransaction()
        .replace(R.id.frgment_holder, frgmtB)
        .addToBackStack(frgmtB.NAME)
        .commit();

getSupportFragmentManager().findFragmentByTag(frgmtA.NAME);

仍然找到了frgmtA?如果添加frgmtA也称为addToBackStack();

文档说“这首先搜索当前添加到管理器活动的片段;如果没有找到这样的片段,则搜索当前在后栈上的所有片段。”

案件将是

  1. 添加frgmtA;不要调用添加到堆栈; UI状态在此处更改;
  2. (如果frgmtA不是由add()动态添加的,但是在布局文件中使用class =“frgmtA”进行了分类怎么办?)。

    1. 用frgmtB替换(); addToStack();

    2. 用frgmtC替换(); addToStack();

    3. 然后如果stackTop是frgmtC,则希望按下后退按钮以使第一个frgmtA返回其最后的UI状态。

3 个答案:

答案 0 :(得分:4)

1

.add(R.id.frgment_holder, frgmtA, frgmtA.NAME)
            .commit();
.replace(R.id.frgment_holder, frgmtB, frgmtB.NAME)
        .addToBackStack(frgmtB.NAME)
        .commit();`

replace将从持有者中删除frgmtA,并且将调用其onDestroyView(但由于它在backstack的事务数据中被引用,因此不会破坏frgmtA)。并且frgmtB将被添加到持有者。 由于frgmtA没有被破坏,

getSupportFragmentManager().findFragmentByTag(frgmtA.NAME); 

会找到它。

之后,按下后​​退按钮,它将从backStack弹出顶级事务,然后反转事务。即从支架上移除frgmtB并将frgmtA添加回支架。由于不再引用frgmtB,因此调用onDestroy。

2。 在

的情况下
add frgmtA;
replace() with frgmtB; addToStack();
replace() with frgmtC; addToStack(); 

如果想要按回跳到frgmtA,需要覆盖onBackPressed(),在其中 做

popBackStack(frgmtB.NAME, POP_BACK_STACK_INCLUSIVE), 

将把堆栈中的事务抛弃在名为frgmtB.NAME的堆栈条目之上,然后在其上反转事务,这将把frgmtA添加回持有者。

答案 1 :(得分:0)

除非您使用onBackPressed()addOnBackStackChangedListener()干扰后退按钮逻辑,否则事情是直截了当的

  • 如果您通过addToBackStack()添加片段,则在点按“后退”时将删除该片段
  • 如果后台堆栈中没有剩余的其他碎片,应用程序将关闭

答案 2 :(得分:0)

尝试此行作为您的需求

您已检查的4个不同行代码

getActivity().getSupportFragmentManager().popBackStack(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

getActivity().getSupportFragmentManager().popBackStackImmediate(null, FragmentManager.POP_BACK_STACK_INCLUSIVE);

    FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.framelayout, fragment);
    transaction.addToBackStack(null);

    getActivity().getSupportFragmentManager().popBackStack();