Intereting Posts
Как выбрать номер телефона в диалоге контактов Android Изменить изображение onConfigurationChanged Невозможно использовать Studio Designer с настраиваемым производным классом RelativeLayout SyncAdapter & SyncResult "Android: textIsSelectable =" true "не работает для TextView в RecyclerView Могу ли я программировать для android с использованием любого языка JVM? Запуск NFC, когда экран заблокирован на Android Ионный сбор Android | Ошибка: не найдены установленные инструменты сборки. Установите инструменты для сборки Android Как сразу же запускать предложения в поисковой системе Android до того, как пользователь даже начал вводить текст WhatsApp-подобный макет для многострочного EditText и кнопок рядом с ним Изменение размера DatePicker в android Android SharedPreferences не сохраняет Обновить приложение Android в эмуляторе без перезапуска эмулятора в Eclipse? Android – AdSense в WebView (для BlackBerry Playbook – Android Runtime) Как показать фонетические (IPA) символы на Android

Активность просочилась в окно / диалог (это снова!)

Да, я читал бесчисленные вопросы относительно той же самой проблемы.

Мой код прост: я просто использую showDialog(int id) в onCreate , а затем поворачиваю устройство. Код – это просто (тестовый пример) , и этого достаточно, чтобы вызвать проблему. showDialog я понимаю, showDialog позаботятся об этом … диалог исчезнет, ​​а затем onCreate будет вызван позже после изменения и снова покажет диалог. Но нет. Что случилось с этим рассуждением?

Я (думаю, я) понимаю причину , но я не знаю, как это решить. Даже приложение с iosched имеет ту же проблему с их реализацией окна EULA (изменение ориентации в диалоге eula и вы получаете утечку). Я читал об отключении диалога onPause, но 1) я рискую уволить, когда он еще не показан, и 2) отслеживание диалога кажется слишком большой работой. Должен быть более надежный подход.

Итак … что такое чистый код, который необходим для его устранения?

Спасибо.


Выход ошибки журнала:

 01-30 00:27:18.615: E/WindowManager(20316): Activity com.test.PreSetupActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@418e0c28 that was originally added here 01-30 00:27:18.615: E/WindowManager(20316): android.view.WindowLeaked: Activity com.test.PreSetupActivity has leaked window com.android.internal.policy.impl.PhoneWindow$DecorView@418e0c28 that was originally added here 01-30 00:27:18.615: E/WindowManager(20316): at android.view.ViewRootImpl.<init>(ViewRootImpl.java:343) 01-30 00:27:18.615: E/WindowManager(20316): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:245) 01-30 00:27:18.615: E/WindowManager(20316): at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:193) 01-30 00:27:18.615: E/WindowManager(20316): at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:118) 01-30 00:27:18.615: E/WindowManager(20316): at android.view.Window$LocalWindowManager.addView(Window.java:537) 01-30 00:27:18.615: E/WindowManager(20316): at android.app.Dialog.show(Dialog.java:274) 01-30 00:27:18.615: E/WindowManager(20316): at com.test.PreSetupActivity.onCreate(PreSetupActivity.java:88) 01-30 00:27:18.615: E/WindowManager(20316): at android.app.Activity.performCreate(Activity.java:4465) 01-30 00:27:18.615: E/WindowManager(20316): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1049) 01-30 00:27:18.615: E/WindowManager(20316): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1919) 01-30 00:27:18.615: E/WindowManager(20316): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1980) 01-30 00:27:18.615: E/WindowManager(20316): at android.app.ActivityThread.handleRelaunchActivity(ActivityThread.java:3347) 01-30 00:27:18.615: E/WindowManager(20316): at android.app.ActivityThread.access$700(ActivityThread.java:122) 01-30 00:27:18.615: E/WindowManager(20316): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1150) 01-30 00:27:18.615: E/WindowManager(20316): at android.os.Handler.dispatchMessage(Handler.java:99) 01-30 00:27:18.615: E/WindowManager(20316): at android.os.Looper.loop(Looper.java:137) 01-30 00:27:18.615: E/WindowManager(20316): at android.app.ActivityThread.main(ActivityThread.java:4340) 01-30 00:27:18.615: E/WindowManager(20316): at java.lang.reflect.Method.invokeNative(Native Method) 01-30 00:27:18.615: E/WindowManager(20316): at java.lang.reflect.Method.invoke(Method.java:511) 01-30 00:27:18.615: E/WindowManager(20316): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 01-30 00:27:18.615: E/WindowManager(20316): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 01-30 00:27:18.615: E/WindowManager(20316): at dalvik.system.NativeStart.main(Native Method) 

Solutions Collecting From Web of "Активность просочилась в окно / диалог (это снова!)"

Имейте внутренний класс, который действует как ваш государственный держатель и имеет там логическое поле, которое указывает, показывает ли ваш диалог. Следите за этим путем изменения ориентации, используя onRetainNonConfigurationInstance и просто повторно показывайте диалог onResume

Вот код + псевдокод:

 public class ProfileActivity extends Activity { private StateHolder mStateHolder; private Dialog dialog; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Object retained = getLastNonConfigurationInstance(); if (retained != null && retained instanceof StateHolder) { mStateHolder = (StateHolder) retained; } else { mStateHolder = new StateHolder(); } } @Override public Object onRetainNonConfigurationInstance() { return mStateHolder; } @Override public void onPause() { super.onPause(); if(dialog != null && dialog.isShowing()) { dialog.dismiss(); } } @Override public void onResume() { if(mStateHolder.mIsShowingDialog) { dialog.show(); } } private void showDialog() { mStateHolder.mIsShowingDialog = true; dialog.show(); } private static class StateHolder { boolean mIsShowingDialog; public StateHolder() {} } }