当警报对话框打开且手机(模拟器)更改其方向时,应用程序崩溃

时间:2011-01-26 01:15:26

标签: android dialog orientation spinner alertdialog

我一直在寻找和研究这一天的人。该应用程序不仅在对话框打开时崩溃,而且在旋转器打开时崩溃(我确信这将是一堆我没有遇到过的其他情况)。

在onRetainNonConfigurationInstance()和onConfigurationChanged(配置newConfig)之间进行选择对我没有帮助。 (也许我错了) - 实际上我更喜欢使用第一个。

但我想问:对于单个打开的对话框或打开微调器,我是否必须从头开始创建所有内容?这是一种方式吗?有时用户可能会改变方向,重新初始化一个包含大量小部件的大班级是没有价值的。

请给我提示和指导。  提前致谢。

已编辑:::

Error code:

01-25 17:56:48.182: ERROR/WindowManager(312): Activity XXX has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@43e63058 that was originally added here
01-25 17:56:48.182: ERROR/WindowManager(312): android.view.WindowLeaked: Activity XXX has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@43e63058 that 
was originally added here
01-25 17:56:48.182: ERROR/WindowManager(312):     at android.view.ViewRoot.<init>(ViewRoot.java:247)
01-25 17:56:48.182: ERROR/WindowManager(312):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:148)
01-25 17:56:48.182: ERROR/WindowManager(312):     at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:91)
01-25 17:56:48.182: ERROR/WindowManager(312):     at android.view.Window$LocalWindowManager.addView(Window.java:424)
01-25 17:56:48.182: ERROR/WindowManager(312):     at android.app.Dialog.show(Dialog.java:241)
01-25 17:56:48.182: ERROR/WindowManager(312):     at XXX.menuGroupDialog(XXX.java:946)
0    1-25 17:56:48.182: ERROR/WindowManager(312):     at XXX.onOptionsItemSelected
(GroupManagement.java:257)
01-25 17:56:48.182: ERROR/WindowManager(312):     at android.app.Activity.onMenuItemSelected(Activity.java:2195)01-25 17:56:48.182: ERROR/WindowManager(312):     at 
com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:730)
01-25 17:56:48.182: ERROR/WindowManager(312):     at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:143)
01-25 17:56:48.182: ERROR/WindowManager(312):     at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:855)
01-25 17:56:48.182: 
ERROR/WindowManager(312):     at com.android.internal.view.menu.IconMenuView.invokeItem(IconMenuView.java:532)
01-25 17:56:48.182: ERROR/WindowManager(312):     at com.android.internal.view.menu.IconMenuItemView.performClick(IconMenuItemView.java:122)
01-25 17:56:48.182: ERROR/WindowManager(312):     at android.view.View$PerformClick.run(View.java:8816)
01-25 17:56:48.182: ERROR/WindowManager(312):     at 
android.os.Handler.handleCallback(Handler.java:587)
01-25 17:56:48.182: ERROR/WindowManager(312):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-25 17:56:48.182: ERROR/WindowManager(312):     at android.os.Looper.loop(Looper.java:123)
01-25 17:56:48.182: ERROR/WindowManager(312):     at 
android.app.ActivityThread.main(ActivityThread.java:4627)
01-25 17:56:48.182: ERROR/WindowManager(312):     at java.lang.reflect.Method.invokeNative(Native Method)
01-25 17:56:48.182: ERROR/WindowManager(312):     at java.lang.reflect.Method.invoke(Method.java:521)
01-25 17:56:48.182: ERROR/WindowManager(312):     at 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
01-25 17:56:48.182: ERROR/WindowManager(312):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
01-25 17:56:48.182: ERROR/WindowManager(312):     at 
dalvik.system.NativeStart.main(Native Method)

我知道这是来自调用dismiss()函数。但是如何在打开对话框时处理方向更改?

4 个答案:

答案 0 :(得分:5)

您是否在AyncTask中使用progressDialog.show()progressbarDialog.dismiss()

如果是,请尝试在AyncTask中使用showDialog(id)dismissDialog(id)而不是它。您必须在onCreateDialog()中编写自定义对话框以显示加载对话框。 showDialog和dismissDialog方法是活动级方法。我的意思是它们是在Activity或其Context上调用的。因此,即使在方向更改后重新创建活动,也会为Dialog提供最新的上下文。

检查示例代码here.根据您的要求修改DIALOG_PROGRESS案例。

此外,onRetainNonConfigurationInstance()与方向更改完美配合。只是由于窗户泄漏问题,你无法看到它。

答案 1 :(得分:1)

默认情况下,您的活动会在方向更改时被销毁并重新创建。您可以关闭它,并通过设置configChanges属性自行处理此配置更改。

答案 2 :(得分:1)

您可以禁用配置更改,也就是说,您可以通过在清单文件中使用XML来阻止应用程序在手机方向更改后尝试重绘:

<activity android:name=".Main" 
 android:label="@string/app_name"
 android:screenOrientation="portrait" 
 android:configChanges="orientation|keyboardHidden">

当手机的方向发生变化时,默认情况下,Android会尝试重新实例化您的网页。

答案 3 :(得分:0)

我有非常类似的问题,我解决它,显示活动attr几乎没有变化。 来自:android:configChanges =“orientation” 要:android:configChanges =“keyboardHidden | orientation”

见这里:Spinner drop-down list and screen orientation change problem