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

FragmentTransaction::replace() with or without addToBackStack()

有流程添加片段和稍后 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();

怎么办

文档说 "This first searches through fragments that are currently added to the manager's activity; if no such fragment is found, then all fragments currently on the back stack are searched."

情况是

  1. 添加 frgmtA;不调用添加到堆栈; UI 状态在这里改变了;

(如果 frgmtA 不是由 add() 动态添加的,而是在布局文件中用 class="frgmtA" 指定的怎么办?)。

  1. 将()替换为frgmtB; addToStack();

  2. 将()替换为frgmtC; addToStack();

然后如果 stackTop 是 frgmtC,希望按下后退按钮以带回第一个 frgmtA 及其最后的 UI 状态。

除非您使用 onBackPressed() or addOnBackStackChangedListener() 干扰后退按钮逻辑,否则事情很简单

  • 如果您通过 addToBackStack() 添加片段,点击“返回”时它将被删除
  • 如果返回堆栈中没有其他碎片,应用将关闭

1.

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

替换将从 holder 中删除 frgmtA,并调用其 onDestroyView(但由于它在后台事务数据中被引用,因此 frgmtA 未被销毁)。并且 frgmtB 将被添加到 holder 中。 由于 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 的堆栈条目上方的交易并在其上反转交易,这将添加回 holder 中的 frgmtA。

根据您的需求尝试这条线路

您检查的是 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();