Как сделать диалог Android модальным? - PullRequest
2 голосов
/ 05 декабря 2011

Я реализовал этот пользовательский AlertDialog следующим образом:

AlertDialog dialog = new AlertDialog.Builder(this)
    .setView(dialogView)
    .setTitle(getResources().getString(R.string.addedit_asklater_price))
    .setCancelable(false)
    .create();

    dialog.setMessage(text);
    dialog.setOwnerActivity(this);
    dialog.setButton(...)
    dialog.setButton(...)
    dialog.show();

    doProcessUserInput();

Однако я заметил, что после dialog.show() элемент управления сразу переходит к doProcessUserInput(), не дожидаясь, пока пользователь не закроет диалог, используя любой издиалоговые кнопки.

Это поведение кажется странным, я ожидал, что диалог будет модальным, как я всегда знал модальные диалоги.

Я могу реструктурировать свой код так, чтобы doProcessUserInput() вызывался из кнопки onClickListener диалогового окна.Однако мне было интересно, есть ли способ приостановить выполнение программы на dialog.show() до завершения диалога.

PS:

  1. Я пытался использовать настраиваемый диалог, который расширяетДиалог, но у него та же проблема.Я создаю диалог в кнопке onClickListener.
  2. Я пытался реализовать Activity::onCreateDialog и использовать showDialog(id) вместо dialog.show(), но это та же проблема.

Ответы [ 4 ]

4 голосов
/ 06 февраля 2013

Это работает для меня: создайте Activity как ваш диалог. Тогда,

  1. Добавьте это в свой манифест для действия:

    Android: тема = "@ андроид: стиль / Theme.Dialog"

  2. Добавьте это в onCreate своей деятельности

    setFinishOnTouchOutside (false);

  3. Переопределить onBackНажмите в своей активности:

    @ Override public void onBackPressed () { // предотвращаем «возврат» из этого действия }

Первый дает деятельности вид диалога. Последние два заставляют его вести себя как модальный диалог.

4 голосов
/ 05 декабря 2011

Конечно, вы можете настроить onPositiveButton щелкните прослушиватель для своего диалогового окна и выполнять действия из этого прослушивателя.

Если вы действительно хотите приостановить свою деятельность в определенный момент, вы, вероятно, можете использоватьстарый механизм java wait/notify или более удобные новые механизмы, такие как исполнители.

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

2 голосов
/ 05 декабря 2011

Кроме того, вы не должны блокировать поток приложений в диалоговом окне.

Руководство разработчика Android и лучшие практики сообщества утверждают, что если вы хотите что-то модальное, вам нужно сделать это вonClickListener с.

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

Перед вызовом метода диалога show () попробуйте вызвать .setCancelable (false) .Это отлично сработало для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...