Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/178.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 何时将重新添加动态添加的片段?_Android_Android Fragments - Fatal编程技术网

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
}