有一个流程来添加片段和后来的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();
文档说“这首先搜索当前添加到管理器活动的片段;如果没有找到这样的片段,则搜索当前在后栈上的所有片段。”
案件将是
(如果frgmtA不是由add()动态添加的,但是在布局文件中使用class =“frgmtA”进行了分类怎么办?)。
用frgmtB替换(); addToStack();
用frgmtC替换(); addToStack();
然后如果stackTop是frgmtC,则希望按下后退按钮以使第一个frgmtA返回其最后的UI状态。
答案 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();