我有一个活动,ActivityA
和3个片段,FragmentA
,FragmentB
和FragmentC
。
要添加FragmentA,我使用replace
,其中fragment
是FragmentA
的新实例:
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.frame_layout_fragment, fragment)
.commit();
在ActivityA的onCreate
方法中,我检查FragmentA
创建:
if (savedInstanceState == null) {
FragmentA fragmentA = FragmentA.newInstance();
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.frame_layout_fragment, fragmentA)
.commit();
}
要添加FragmentB
和FragmentC
,我使用add
和addToBackStack
,其中fragment
是FragmentB
的新实例或{ {1}}:
FragmentC
我在getSupportFragmentManager()
.beginTransaction()
.add(R.id.frame_layout_fragment, fragment)
.addToBackStack(null)
.commit();
上按下后退按钮,显示FragmentC
,并在FragmentB
显示FragmentB
时按下后退按钮,如预期的那样。当我在FragmentA
时,我会旋转设备,FragmentC
仍会按预期显示。
但是,当我使用后退按钮的2次按钮从FragmentC
导航到FragmentC
时,请将设备旋转两次,纵向 - >风景 - >纵向,添加FragmentA
,添加FragmentB
,然后我将设备旋转一次,我希望显示FragmentC
,而是显示FragmentC
。当我按下后退按钮一次时,没有任何反应。当我再次按下它时,它会导航回FragmentB
。似乎FragmentA
存在于后台堆栈中,但由于某种原因它不可见。
为什么FragmentC
在这种情况下不可见?
答案 0 :(得分:1)
我认为对另一个问题的回答也是你的回答:Difference between add(), replace(), and addToBackStack()
它说:
添加和替换之间的另一个重要区别是:替换 删除现有片段并添加新片段。这意味着何时 按下后退按钮,将创建被替换的片段 调用onCreateView。而添加保留了现有的 片段并添加一个新片段,表示现有片段将是 当有后退按钮时,它们不会处于“暂停”状态 没有为现有片段调用onCreateView( 在添加新片段之前存在的片段)。就......而言 片段的生命周期事件onPause,onResume,onCreateView等 在替换的情况下将调用生命周期事件,但它们不会 在添加时调用。