происходит сбой приложения при открытии диалогового окна с предупреждением и изменении ориентации телефона (эмулятора) - PullRequest
1 голос
/ 26 января 2011

ребята, я искал и изучал об этом целый день.Приложение аварийно завершает работу не только при открытом диалоговом окне, но и при открытом вращающемся устройстве (и я уверен, что это будет куча других сценариев, с которыми я не сталкивался).

выбор между 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 ]

5 голосов
/ 26 января 2011

Используете ли вы progressDialog.show() и progressbarDialog.dismiss() в AyncTask?

Если да, попробуйте использовать вместо него showDialog(id) и dismissDialog(id) в AyncTask.Вам придется написать собственный диалог в onCreateDialog() для отображения диалога загрузки.Методы showDialog и dismissDialog являются методами уровня активности.Я имею в виду, что они вызываются на активность или ее контекст.Таким образом, даже если действие воссоздается после изменения ориентации, последний диалог будет доступен для диалога.

проверьте код образца здесь. Измените DIALOG_PROGRESS регистр в нем в соответствии с вашими требованиями.

Кроме того, onRetainNonConfigurationInstance() отлично работает с изменением ориентации.Просто из-за утечки окна вы не можете его увидеть.

1 голос
/ 26 января 2011

Вы можете отключить изменения конфигурации, то есть вы можете запретить приложению пытаться перерисовать, как только меняется ориентация телефона, используя XML в файле манифеста:

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

Когда ориентация вашего телефона изменится, по умолчанию Android попытается восстановить вашу страницу.

1 голос
/ 26 января 2011

По умолчанию ваша активность уничтожается и воссоздается при изменении ориентации.Вы можете отключить это и передать это изменение конфигурации самостоятельно, установив атрибут configChanges .

0 голосов
/ 09 марта 2011

У меня была очень похожая проблема, я разрешила ее с небольшими изменениями в атрибуте явной активности. От: android: configChanges = "Ориентация" Кому: android: configChanges = "клавиатура скрытая | ориентация"

см. Здесь: Раскрывающийся список Spinner и проблема изменения ориентации экрана

...