最小化应用程序,更改语言和恢复调用onCreate()而不是onResume()

时间:2013-03-05 09:06:39

标签: android android-activity activity-lifecycle

我刚注意到我在应用中遇到的一个奇怪的问题。当我运行我的应用程序时,如果我最小化它,然后去设置并更改语言,然后恢复我的应用程序(注意:这是最小化/恢复,而不是退出/开始),它调用活动的onCreate()而不是调用onResume()

这导致了很多问题,特别是在我在视图中使用片段的区域。显示的片段是旧片段,但它们所持有的活动参考是null。因此getActivity()在恢复后无法立即生效,导致许多地方NullPointerException

我的应用程序是针对Android 4.0.4及更高版本构建的,我在不同的设备和模拟器上发现了这个问题,因此它不是平台问题。

理想情况下,我想按照它应该调用onResume()。如果没有,我宁愿让应用程序以静默方式重新启动,并将用户置于主屏幕上,而不必面对应用程序崩溃。

该应用程序本身仅支持一种语言:英语(美国)。

以前有人遇到过这个问题吗?如果是的话,你能设法解决它吗?

编辑:基于Class Stacker的答案,我似乎需要自己处理配置更改。哪个应该没问题,除了onCreate()本身抛出异常。我在getWindow().setRequestFeature(Window.FEATURE_INDETERMINATE_PROGRESS)中呼叫onCreate()。当定位发生变化时,这一行会抛出一个RuntimeException,说明必须在setContentView()之前调用它。

这是否意味着我的活动没有被正确销毁?

3 个答案:

答案 0 :(得分:3)

这不是问题,而是设计。

如果语言发生变化,那就是配置更改,就像屏幕旋转一样。

这意味着必须重新创建很多东西。因此,这是通过onCreate()来处理的。

对于坏消息感到抱歉,但您必须更正创建对象的位置以及onCreate amnd onResume如何互操作。

请参阅here

修改:关于RuntimeException,为了安全起见,请在getWindow().setRequestFeature(Window.FEATURE_INDETERMINATE_PROGRESS)之前致电super.onCreate(savedInstanceState),正如您在我们聊天时发现的那样。

答案 1 :(得分:1)

将这些行放在您的清单文件中,看看它是否有效。

    <activity
        android:name="youractivity"
        android:configChanges="locale|layoutDirection"
        android:label="youractivitylabel" />

答案 2 :(得分:0)

在更改区域设置后,我在片段中遇到了与空指针异常相同的问题。为了将来的参考,我分享了一个我觉得有用的解决方案。在片段onCreateView()中添加以下行:

this.setRetainInstance(true);

这可以防止调用onDestroy()onCreate()。相反,将调用onDetach()onAttach(Activity)。它帮助了我,希望它可以帮助其他人来到这个页面。 请参阅reference