Android 何时将重新添加动态添加的片段?
显示了在Android 何时将重新添加动态添加的片段?,android,android-fragments,Android,Android Fragments,显示了在onCreate(…)中动态添加片段的活动示例: 这对我来说几乎是有道理的,除了一个细节。我认为检查savedInstanceState==null的原因是,如果活动被重新创建,我们可以期望框架为我们重新添加片段。但是,我认为只有当片段有标记时,框架才会这样做,并且示例使用了不带标记的FragmentTransaction#add(…)版本。据我所知,如果重新创建此活动,它将不会有DetailsFragment 我的理解错了吗?如果框架确实重新添加了片段,那么在活动的生命周期中的什么时候
onCreate(…)
中动态添加片段的活动示例:
这对我来说几乎是有道理的,除了一个细节。我认为检查savedInstanceState==null
的原因是,如果活动被重新创建,我们可以期望框架为我们重新添加片段。但是,我认为只有当片段有标记时,框架才会这样做,并且示例使用了不带标记的FragmentTransaction#add(…)
版本。据我所知,如果重新创建此活动,它将不会有DetailsFragment
我的理解错了吗?如果框架确实重新添加了片段,那么在活动的生命周期中的什么时候可以保证这样做?我的片段和我的工作没有使用标记,我的测试与您的测试完全相同
if (savedInstanceState == null) {
//fragment needs to be created
}
if (savedInstanceState != null) {
//fragment will automatically be there with no code
}
我认为只有当片段有标记时,框架才会这样做[重新添加片段]
否。根据“向活动添加片段”一节:
每个片段都需要一个唯一的标识符,如果活动重新启动,系统可以使用该标识符来恢复片段
因此,您有3种可能来处理此问题:使用唯一id
、唯一标记
或它们都不使用。是的,前两个要求都没有。添加标记的目的是捕获片段。如果您希望轻松检索并使用它(例如执行事务),这将非常有用。但是,这不是必需的
使用时,它在第三个参数处使用null标记
进行调用。因此,系统将使用容器视图的ID(在add()
中的第一个参数)。因此,片段将在没有任何id
或tag
的情况下恢复,这些标记是您提供的,但由系统正确处理的
注意:在add(int,Fragment,String)
的参考中,您可以看到这句话:“片段的可选标记名,稍后使用FragmentManager.findFragmentByTag(String)
”-如果我们需要它来恢复片段,它怎么可能是可选的?;)
在活动的生命周期中,它保证在什么时候这样做
我不能诚实地对此做出回应,也许有人有正确的答案,但是,以下是我的想法
正如您在中所看到的,当“活动”上发生方向(或任何特定更改)时,它会调用onDestroy()
,并直接调用onCreate()
。在调用(活动的)onCreate()
时,子片段将在onAttach()
中接收回调。此外,当活动收到其onCreate()
回调时,子片段会自动收到onActivityCreated()
回调。之后,“活动”中的每个方法将触发“完全”相同的子方法(onStart()
,onResume()
,onPause()
,onStop()
)
因此,我认为安全点是onStart()
,因为活动直接触发片段方法的调用,您可以确保片段已附加到它,并且您可以处理onRestart()->onStart()
,以更新UI。。你知道片段什么时候会出现吗?我编写了一个测试应用程序,发现甚至在调用活动的onCreate()
之前,片段就被还原了。但我仍然想知道这是否有保证。
if (savedInstanceState == null) {
//fragment needs to be created
}
if (savedInstanceState != null) {
//fragment will automatically be there with no code
}