3

有一个添加片段和以后replace()片段的流程。所有片段都是动态添加的,但不是所有的 call addToBackStack()

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

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

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

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

如果在将片段添加到同一个容器中的流程中,使用连续的 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 状态在此处更改;

(如果 frgmtA 不是由 add() 动态添加,而是在布局文件中使用 class="frgmtA" 进行了分隔怎么办?)。

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

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

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

4

3 回答 3

6

1.

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

替换将从持有者中删除 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。

于 2015-11-06T02:37:17.997 回答
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();
于 2018-07-30T07:48:01.037 回答
0

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

  • 如果你通过添加一个片段addToBackStack(),当点击返回时它会被移除
  • 如果后栈中没有其他碎片,应用程序将被关闭
于 2015-11-03T21:14:11.513 回答