3

我创建了一个简单的 TabActivity,它在运行时构建选项卡,读取一些 JSON 数据。目前,我正在为每个选项卡初始化一个带有虚拟随机项的空 ListActivity,只是为了查看从选项卡到选项卡的更改是有效的,并且内容不会消失。选项卡的实际内容存储在单例类中,因此当由于屏幕方向更改而重新创建选项卡活动时,它们只需根据意图的附加包中包含的标识符从相应列表中提取正确的虚拟项目.

一切正常。我已经在列表活动 onCreate 方法上记录了一个日志,以观察活动在屏幕旋转时重新创建,并且确实如此。然而,有些奇怪的是第一个选项卡的活动总是重新创建,即使它不可见。当我切换到第三个或第四个选项卡并旋转设备时,除了第一个选项卡外,之前的选项卡会被杀死并且不会再次重新创建。第一个选项卡始终存在。为什么?我会理解代码中的错误,但选项卡活动是从教程中复制的,并且所有选项卡的列表活动都是相同的。这是我得到的一些日志:

List created with 1
onConfigurationChanged
List created with 1
List created with 2
List created with 4
List created with 5
List created with 6
onConfigurationChanged
List created with 1
List created with 6
onConfigurationChanged
List created with 1
List created with 6
onConfigurationChanged
List created with 1
onConfigurationChanged
List created with 1
List created with 2
onConfigurationChanged
List created with 1
List created with 2
onConfigurationChanged
List created with 1
List created with 2
List created with 4
onConfigurationChanged
List created with 1
List created with 4
onConfigurationChanged
List created with 1
List created with 4
List created with 5
onConfigurationChanged
List created with 1
List created with 5
onConfigurationChanged
List created with 1
List created with 5

正如您从日志中看到的那样,每个列表活动都会记录放在附加包中的标识符,并且几乎没有做任何其他事情。因此应用程序启动并创建了第一个选项卡,然后我旋转并切换到其他选项卡。他们的 onCreate 方法被调用。然后日志显示我如何切换标签和旋转。根据可见的选项卡重新创建不同的活动,但第一个活动始终存在!

为什么总是重新创建第一个选项卡?出于某种原因需要这种特殊行为吗?我在 HTC Legend API 级别 7 上看到了这一点。

更新:我在 TabActivity 的循环中添加了更多日志,创建了各个选项卡,看起来当添加第一个选项卡时,它的活动总是被创建。有没有办法避免这种情况?也许创建虚拟的空选项卡,然后用真实的活动填充它们?更多日志:

onConfigurationChanged
Tab: Saving tab index 3
...
Tab: Adding tab 1
List created with 1
Tab: Adding tab 2
Tab: Adding tab 3
Tab: Adding tab 4
Tab: Adding tab 5
Tab: Setting tab to index 3
List created with 5
4

2 回答 2

1

在活动的生命周期方法中添加更多日志后,我发现始终为第一个选项卡创建 onCreate() 和 onStart() 方法,但仅对可见选项卡调用 onResume() 方法。所以我会将我的惰性初始化代码放在 onResume() 方法上,以避免第一个活动使应用程序陷入困境。

可能 TabActivity 在内部以与http://developer.android.com/reference/android/widget/ViewFlipper.html类似的方式工作,这就是为什么第一个选项卡活动总是被创建,尽管不可见。

于 2011-06-09T13:07:24.787 回答
0

尝试将初始选项卡更改为 2..n 并查看是否是创建的选项卡。我打赌这与 Android 如何处理 TabActivity 有关。如果这是真的,那么您可以检查您所在的选项卡!= null 并将其用作第一个选项卡,如果为 null,则默认为 1。

于 2011-06-09T11:28:17.650 回答