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."
情况是
- 添加 frgmtA;不调用添加到堆栈; UI 状态在这里改变了;
(如果 frgmtA 不是由 add() 动态添加的,而是在布局文件中用 class="frgmtA" 指定的怎么办?)。
将()替换为frgmtB; addToStack();
将()替换为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();
有流程添加片段和稍后 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."
情况是
- 添加 frgmtA;不调用添加到堆栈; UI 状态在这里改变了;
(如果 frgmtA 不是由 add() 动态添加的,而是在布局文件中用 class="frgmtA" 指定的怎么办?)。
将()替换为frgmtB; addToStack();
将()替换为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();