Intereting Posts
Android: Dex не может анализировать код байта версии 52 Размер текста в дизайне Android TabLayout Android: какой из них лучше, просмотрщик, галерея, горизонтальный просмотр прокрутки … или? Как отлаживать, какие тревоги AlarmManager запускаются из вашего приложения? Как создать новый плейлист с помощью ContentResolver Моя Android-камера Uri возвращает нулевое значение, но исправление Samsung на месте, помощь? Android Studio: как сгенерировать подписанный apk с помощью Gradle? SharedPreferences.onSharedPreferenceChangeListener не называется последовательно Как выборочно украшать элементы RecyclerView Как удалить неиспользуемые ресурсы из сторонних библиотек, которые я включил в Android? Не удалось найти INI-файл в $ ANDROID_AVD_HOME или в $ HOME / .android / avd Как преобразовать изображение в строку Base64? Использование JRuby для прямого вызова методов Java Java Хранение данных приложений Android на SD-карте Определять, перекрываются ли виды

Диалоговое отображение, отображаемое из onContextItemSelected, не сохранилось onPause / onResume

У меня есть DialogDragment, который я могу показать одним из двух способов:

1) Нажав на элемент ListView из своего OnItemClickListener

2) Включив контекстное меню ListView и выбрав пункт меню

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

Я экспериментировал, и если я поместил отображение DialogFragment в обработчик с задержкой не менее 1/2 секунды, это сработает.

Следующий фрагмент завершается неудачно – он показывает диалог, но затем пауза / возобновление скрывает его:

public boolean onContextItemSelected(android.view.MenuItem item) { boolean consumed = false; switch (item.getItemId()) { case R.id.menu_item: showMyDialogFragment(); consumed = true; break; } return consumed; } 

Так работает следующий фрагмент. Приостановить / возобновить отображение диалогового окна еще раз:

 public boolean onContextItemSelected(android.view.MenuItem item) { boolean consumed = false; switch (item.getItemId()) { case R.id.menu_item: new Handler().postDelayed(new Runnable() { public void run() { showMyDialogFragment(); } }, 300); consumed = true; break; } return consumed; } 

Замена 300 мс второй задержки на 0 мс или 250 мс заставляет ее снова сломать. Это повторяемость в 100% случаев.

Очевидно, это ужасный взлом, который усугубляется константой, которая, вероятно, зависит от скорости устройства.

Кто-нибудь знает, почему это происходит и / или предлагает лучшее решение? Я потратил несколько часов на эту проблему, и это лучшее, что я мог бы придумать.

Solutions Collecting From Web of "Диалоговое отображение, отображаемое из onContextItemSelected, не сохранилось onPause / onResume"

Я могу воспроизвести это на Android 4.2 (эмулятор ARM и Galaxy Nexus). Я не могу воспроизвести ваши результаты на эмуляторе x86 4.1, Nexus S (4.1) и Motorola RAZR i (4.0). Я также могу воспроизвести проблему, изменив одну из моих собственных образцов книг. Я подал на него вопрос, используя ваш образец: http://code.google.com/p/android/issues/detail?id=41901. Пожалуйста, добавьте любую другую информацию, которая, по вашему мнению, поможет им диагностировать проблему.

Что касается обходного пути, если работает 300 мс, то у нас есть одна из тех прекрасных «проблем с синхронизацией», и у меня нет самой туманной идеи, как бы вы ее работали, не используя меню для ее отображения. Например, с вашим примером приложения просто переключиться на SHOW_AS_ACTION_ALWAYS (и, следовательно, быть его элементом на панели действий, а не в меню переполнения) достаточно для DialogFragment поведения DialogFragment . Надеюсь, у вас будет возможность настроить свой пользовательский интерфейс, чтобы компенсировать эту ошибку, или, возможно, кто-то приготовит еще одно обходное решение и опубликует его здесь или по этой проблеме.

Я бы рекомендовал уничтожить диалог во всех паузах и воссоздать inResume в зависимости от состояния независимо от того, как вызывается диалог. В противном случае возникает риск утечки памяти, если приложение будет заблокировано операционной системой во время паузы.

Чтобы явным образом ответить на ваш вопрос, не полагайтесь на ОС для поддержания состояния вашего приложения.