我有一个片段A.我document.addEventListener("resume", onResume, false);
function onResume() {
screen.lockOrientation('landscape');
}
标签如下:
add()
然后我只是在片段A的顶部fragmentTransaction.addToBackStack(special_tag);
片段B.之后,我决定删除片段B并使用以下命令返回片段A:
add()
当我到达片段A时,似乎片段不会重新运行它的生命周期方法:onAttach(),onResume(),onCreate()等。
有人可以解释这种行为并建议另类吗?
(当我第二次回到片段A时,我需要“刷新”数据)
导致此结果的原因是什么?
是否有干净的解决方案/解决方法?
更新
片段B是activity.fragmentManager.popBackStackImmediate(special_tag, 0)
,没有GuidedStepFragment
函数。我发现它有.replace()
,但它的行为相同(它不调用片段生命周期函数)
情况(再次):
片段A(简单片段) - > .add(片段B)(GuidedStepFragment) - > finishGuidedStepFragments()
或popBackStackImmediate()
我像这样添加片段B:
finishGuidedStepFragments()
答案 0 :(得分:3)
使用fragmentTransaction.add(Fragment)
不会删除片段A.实际上发生的是片段A 仍在运行片段B后面。由于片段A从未停止运行,因此它的生命周期不需要重新触发。
考虑使用fragmentTransaction.replace(Fragment)
并用片段B替换容器中的片段(片段A)。如果从后台堆栈弹出该事务,则片段A将重新附加并遵循预期的生命周期。
<强>更新强>
由于您似乎正在使用leanback库中的GuidedStepFragment
,因此这有点棘手。 GuidedStepFragment
实际上在幕后执行replace(...)
,但您将片段B添加到其他容器中,因此我提到的原始行为不适用。
我不熟悉leanback(因为它通常只用于Android电视),但我知道你至少可以做到以下几点。如果您跟踪后台堆栈大小,当弹出所有GuidedStepFragment
时,您将返回原始片段。例如,假设你的后台开始于零:
activity.fragmentManager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
if (activity.fragmentManager.getBackStackEntryCount() == 0){
// handle your updates
}
}
});
// the next line of code will add an entry to the backstack
GuidedStepFragment.add(activity.fragmentManager, fragmentB.createInstance());
// eventually when back is pressed and the guided fragment is removed, the backstack listener should trigger