Intereting Posts
Как сохранить мой класс от путаницы с помощью proguard Выделите таинственное поведение в ListView Приложение Google SignIn без добавления его в учетные записи устройства Cordova 3.4.0 navigator.camera.getPicture не вызывает обратный вызов onSuccess или onFail для Android 4.3 Внедрение Visual Studio 2015 Xamarin без ошибок Как добавить значок (изображение, логотип ..) в строку состояния Как преобразовать 16-битный бит байтового массива PCM в двойной или плавающий массив? Почему возможно написать булевский массив в посылку, но не логический? Напишите раз развертывание на Windows Mobile 6, Windows Phone 7, Android и iPhone? Каковы преимущества использования Джека и Джилл? Как использовать центр представления как контрольную точку внутри RelativeLayout Получение имени пакета и подписей из uid / pid приложения в собственном клиенте Внедрение приложения для Android в приложении Android: как добавить кнопку в виде поверхности Не удалось найти следующие классы: – android.support.design.widget.TextInputLayout

Диалоговое отображение, отображаемое из 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 в зависимости от состояния независимо от того, как вызывается диалог. В противном случае возникает риск утечки памяти, если приложение будет заблокировано операционной системой во время паузы.

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