我刚注意到我在应用中遇到的一个奇怪的问题。当我运行我的应用程序时,如果我最小化它,然后去设置并更改语言,然后恢复我的应用程序(注意:这是最小化/恢复,而不是退出/开始),它调用活动的onCreate()
而不是调用onResume()
。
这导致了很多问题,特别是在我在视图中使用片段的区域。显示的片段是旧片段,但它们所持有的活动参考是null
。因此getActivity()
在恢复后无法立即生效,导致许多地方NullPointerException
。
我的应用程序是针对Android 4.0.4及更高版本构建的,我在不同的设备和模拟器上发现了这个问题,因此它不是平台问题。
理想情况下,我想按照它应该调用onResume()
。如果没有,我宁愿让应用程序以静默方式重新启动,并将用户置于主屏幕上,而不必面对应用程序崩溃。
该应用程序本身仅支持一种语言:英语(美国)。
以前有人遇到过这个问题吗?如果是的话,你能设法解决它吗?
编辑:基于Class Stacker的答案,我似乎需要自己处理配置更改。哪个应该没问题,除了onCreate()
本身抛出异常。我在getWindow().setRequestFeature(Window.FEATURE_INDETERMINATE_PROGRESS)
中呼叫onCreate()
。当定位发生变化时,这一行会抛出一个RuntimeException
,说明必须在setContentView()
之前调用它。
这是否意味着我的活动没有被正确销毁?
答案 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。