【发布时间】:2013-03-05 09:06:39
【问题描述】:
我刚刚注意到我的应用程序中出现了一个奇怪的问题。当我运行我的应用程序时,如果我最小化它,然后去设置并更改语言,然后恢复我的应用程序(注意:这是最小化/恢复,而不是退出/启动),它调用 Activity 的 onCreate() 而不是打电话给onResume()。
这会导致很多问题,尤其是在我在视图中使用片段的区域。显示的片段是旧片段,但它们持有的活动引用是null。所以getActivity()在恢复后并没有立即生效,导致很多地方出现NullPointerException。
我的应用是为 Android 4.0.4 及更高版本构建的,我在不同的设备和模拟器上注意到了这个问题,所以这不是平台问题。
理想情况下,我想致电onResume()。如果没有,我宁愿让应用程序自行重新启动,并将用户置于主屏幕上,而不必面对应用程序崩溃。
应用程序本身仅支持一种语言:英语(美国)。
以前有人遇到过这个问题吗?如果是,你能设法解决它吗?
编辑:根据 Class Stacker 的回答,看来我需要自己处理配置更改。这应该没问题,除了onCreate() 本身引发了异常。我在onCreate() 中打电话给getWindow().setRequestFeature(Window.FEATURE_INDETERMINATE_PROGRESS)。当定位发生变化时,这一行会抛出一个RuntimeException,表示必须在setContentView() 之前调用它。
这是否意味着我的 Activity 没有被正确销毁?
【问题讨论】:
-
关于您的编辑,请确定:您是否在
setContentView()之前致电setRequestFeature()? -
当然。我所有的活动都继承自 BaseActivity。 setRequestFeature 在我的个人活动的 onCreate() 中调用的基本活动的 onCreate() 中被调用。之后我才在我的活动中调用 setContentView()。
-
由于我的应用只支持一种语言,我可以通过在我的 Manifest 中设置 configChanges="locale" 来“修复”它,但我想把它作为绝对的最后手段。
-
嗯...您现在如何处理配置更改中的片段?重新创建它们?
-
您仍然可以在检测到配置更改时完全避免调用
setRequestFeature(),这很容易。问题是,它是否产生了预期的结果。
标签: android android-activity activity-lifecycle