Android 最小化应用程序,更改语言并继续调用onCreate()而不是onResume()
我刚刚注意到我的应用程序中出现了一个奇怪的问题。当我运行我的应用程序时,如果我将其最小化,则转到设置并更改语言,然后恢复我的应用程序(注意:这是最小化/恢复,而不是退出/启动),它将调用活动的Android 最小化应用程序,更改语言并继续调用onCreate()而不是onResume(),android,android-activity,activity-lifecycle,Android,Android Activity,Activity Lifecycle,我刚刚注意到我的应用程序中出现了一个奇怪的问题。当我运行我的应用程序时,如果我将其最小化,则转到设置并更改语言,然后恢复我的应用程序(注意:这是最小化/恢复,而不是退出/启动),它将调用活动的onCreate(),而不是调用onResume() 这导致了很多问题,尤其是在视图中使用片段的区域。显示的片段是旧片段,但它们所持有的活动引用是null。因此,恢复后,getActivity()不会立即工作,导致许多地方出现NullPointerException 我的应用程序是为Android 4.0.
onCreate()
,而不是调用onResume()
这导致了很多问题,尤其是在视图中使用片段的区域。显示的片段是旧片段,但它们所持有的活动引用是null
。因此,恢复后,getActivity()
不会立即工作,导致许多地方出现NullPointerException
我的应用程序是为Android 4.0.4及以上版本构建的,我在不同的设备和模拟器上注意到了这个问题,所以这不是平台问题
理想情况下,我希望按预期调用onResume()
。如果没有,我更愿意让应用程序自动重新启动,并将用户放在主屏幕上,而不必面对应用程序崩溃
该应用程序本身只支持一种语言:英语(美国)
以前有人遇到过这个问题吗?如果是,你能设法解决它吗
编辑:根据类Stacker的回答,似乎我需要自己处理配置更改。除了在onCreate()
本身中引发异常之外,这应该没问题。我正在调用onCreate()
中的getWindow().setRequestFeature(Window.FEATURE\u undeterminate\u PROGRESS)
。当locate更改时,此行抛出一个RuntimeException
,表示必须在setContentView()之前调用它
这是否意味着我的活动没有被正确地销毁?这不是问题,而是设计的问题
如果语言改变,那就是配置的改变,就像屏幕旋转一样
这意味着很多东西需要重新创造。因此,这是通过onCreate()处理的
很抱歉听到这个坏消息,但您必须更正创建对象的位置以及onCreate amnd onResume的互操作方式
看
编辑:关于运行时异常
,为了安全起见,请在super.onCreate(savedInstanceState)
之前调用getWindow().setRequestFeature(Window.FEATURE\u undeterminate\u PROGRESS)
,正如您在聊天时发现的那样。这不是问题,这是设计的
如果语言改变,那就是配置的改变,就像屏幕旋转一样
这意味着很多东西需要重新创造。因此,这是通过onCreate()处理的
很抱歉听到这个坏消息,但您必须更正创建对象的位置以及onCreate amnd onResume的互操作方式
看
编辑:关于运行时异常
,为了安全起见,请在super.onCreate(savedInstanceState)
之前调用getWindow().setRequestFeature(Window.FEATURE\u undeterminate\u PROGRESS)
,正如您在聊天时发现的那样。将这些行放在清单文件中,看看它是否有效
<activity
android:name="youractivity"
android:configChanges="locale|layoutDirection"
android:label="youractivitylabel" />
将这些行放在清单文件中,看看它是否有效
<activity
android:name="youractivity"
android:configChanges="locale|layoutDirection"
android:label="youractivitylabel" />
在更改区域设置后,片段中出现空指针异常的问题与此相同。为了将来的参考,我分享了一个我认为对我的案例有帮助的解决方案。在片段的onCreateView()
中,只需添加以下行:
this.setRetainInstance(true);
这将阻止调用onDestroy()
和onCreate()
。相反,将调用onDetach()
和onAttach(活动)
。它帮助了我,希望它可以帮助其他人来到这一页。
请参阅。更改区域设置后,我在片段中遇到了相同的空指针异常问题。为了将来的参考,我分享了一个我认为对我的案例有帮助的解决方案。在片段的onCreateView()
中,只需添加以下行:
this.setRetainInstance(true);
这将阻止调用onDestroy()
和onCreate()
。相反,将调用onDetach()
和onAttach(活动)
。它帮助了我,希望它可以帮助其他人来到这一页。
请参阅。Hmm。。我懂了。问题是,这不是问题。我的活动会恢复得很好。问题是,生活在同一活动中的片段似乎没有被销毁,这导致了问题。我将尝试重新创建它们,看看会发生什么。@Vinayshenoy可能需要在“非配置”对象中存储一些数据,但这取决于实际显示的内容的性质、是否正在运行异步任务等。据我所知,更改语言会导致Phonegap应用程序在Android上崩溃。。。所以你的情况很好。@stu.salsbury这个问题实际上是通过我答案的编辑部分中提到的方法解决的,所以据我所知,再也不会崩溃了。@Class Stacker--谢谢,是的。。。问题是我处于HTML5 Phonegap构建环境中,因此您的解决方案比我能够访问的更低级。不过,我会将我的电话差距问题指向您的解决方案。我认为他们应该实施它。嗯。。我懂了。问题是,这不是问题。我的活动会恢复得很好。问题是,生活在同一活动中的片段似乎没有被销毁,这导致了问题。我将尝试重新创建它们,看看会发生什么。@Vinayshenoy可能需要在“非配置”对象中存储一些数据,但这取决于实际显示的内容的性质、是否正在运行异步任务等。据我所知,更改语言会导致Phonegap应用程序在Android上崩溃。。。所以你的情况很好。@stu.salsbury这个问题实际上是通过我答案的编辑部分中提到的方法解决的,所以据我所知,再也不会崩溃了。@Class Stacker--谢谢,是的。。。问题是我在HTML5 Phonegap构建环境中