2

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

这导致了很多问题,尤其是在我在视图中使用片段的区域。正在显示的片段是旧片段,但它们持有的活动引用是null. 所以getActivity()恢复后不能立即生效,导致NullPointerException很多地方。

我的应用程序是为 Android 4.0.4 及更高版本构建的,我在不同的设备和模拟器上注意到了这个问题,所以这不是平台问题。

理想情况下,我想onResume()按应有的方式打电话。如果没有,我宁愿让应用程序自行重新启动,并将用户置于主屏幕上,而不必面对应用程序崩溃。

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

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

编辑:根据 Class Stacker 的回答,看来我需要自己处理配置更改。这应该没问题,除了onCreate()本身引发异常。我正在打电话getWindow().setRequestFeature(Window.FEATURE_INDETERMINATE_PROGRESS)onCreate()当定位发生变化时,这一行抛出了一个RuntimeException说法,即 this must be called before setContentView()

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

4

3 回答 3

3

这不是问题,这是设计使然。

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

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

很抱歉这个坏消息,但您必须更正创建对象的位置以及 onCreate 和 onResume 如何互操作。

这里

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

于 2013-03-05T09:12:47.863 回答
1

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

    <activity
        android:name="youractivity"
        android:configChanges="locale|layoutDirection"
        android:label="youractivitylabel" />
于 2014-06-26T13:29:33.020 回答
0

更改语言环境后,我在片段中遇到了同样的空指针异常问题。为了将来参考,我分享了一个对我的案例很有帮助的解决方案。在片段中onCreateView()只需添加以下行:

this.setRetainInstance(true);

这可以防止调用onDestroy()onCreate()。相反,onDetach()并且onAttach(Activity)会被调用。它帮助了我,希望它可以帮助到这个页面的其他人。请参阅参考资料

于 2017-03-05T16:54:30.120 回答