Диалоговые окна / AlertDialogs: Как “заблокировать выполнение”, в то время как диалоговое окно (стиль.NET)

Происходя из среды.NET, я теперь надеюсь понимать, как Диалоговые окна работают в Android.

В.NET, при вызове MessageBox.Show(...) это создает и показывает всплывающее диалоговое окно. В вызове для Показа я могу указать, какие кнопки должны быть доступными во всплывающем окне, например:

DialogResult myDialogResult = MessageBox.Show("My text here", "My caption here", MessageBoxButtons.YesNoCancel);

Как Вы видите, вызов, чтобы Показать возвратам DialogResult, когда кнопка нажимается во всплывающем окне, сообщая мне, какая кнопка была нажата. Обратите внимание, что в.NET, выполнение останавливается в строке где вызов к Show(...) сделан, таким образом, это может возвратить значение, когда кнопка нажимается.

Если я в вышеупомянутом примере нажму "No", то myDialogResult будет равен

myDialogResult == DialogResult.No

Так как я нахожу путь.NET использовать/создавать всплывающие окна, очень легкие и интуитивные, я хотел бы тот способ создать всплывающие окна в Android также.

Так, вопрос состоит в том, если кто-либо знает, как "остановить выполнение" как с MessageBox.Show, и затем возвратите значение каждый раз, когда Кнопка нажимается (и диалоговое окно уходит)?

Редактирование 1

Быть ясным:

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

Вот почему я не могу использовать то, что предлагают Erich и Alex, так как написание кода в onClick-методах, как предложено ниже не собирается работать. Причина состоит в том, что я не могу продолжить "нормальное выполнение". Позвольте мне взять пример:

Позвольте мне взять пример:

int nextStep = 0; // this variable will not be reached from within the onClick-methods

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Hello!")
       .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                nextStep = 1; // *** COMPILER ERROR!! ***
            }
        })
        .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int id) {
                nextStep = 2; // *** COMPILER ERROR!! ***
            }
        })
        .create().show();

if (nextStep == 1)
{
    // then do some damage
}
else if (nextStep == 2
    // dont do damage

Если бы я хотел, чтобы выполнение зависело от выбора во всплывающем окне, то я должен был бы так или иначе сделать все переменные в "нормальном выполнении" (в этом случае nextStep) доступный в onClick-методах, и это походит на ад мне.

Редактирование 2

Другим очевидным примером было бы всплывающее окно, спрашивающее, "Сделать Вы хотите продолжить" опциями "Yes" и "No".

Если пользователь нажимает "Yes", целый метод должен быть прерван иначе, он должен продолжить выполнение. Как Вы решаете это приятно?

69
задан halfer 12 May 2019 в 21:40
поделиться

6 ответов

Тед, ты действительно не хочешь этого делать :) Самая большая причина в том, что если вы заблокируете поток пользовательского интерфейса во время отображения диалогового окна, вы заблокируете поток, отвечающий за отрисовку и обработку событий ваш диалог. Это означает, что ваш диалог не будет отвечать. Вы также вызовете ошибку ANR, если пользователю потребуется более нескольких секунд, чтобы щелкнуть диалоговое окно.

Ответ Эриха - именно то, что вам нужно. Я знаю, что это не то, что вы хотите , но это не имеет значения. Мы разработали Android, чтобы разработчики не могли писать синхронные диалоги, поэтому у вас действительно нет особого выбора.

47
ответ дан 24 November 2019 в 13:50
поделиться

Это самый простой способ:

new AlertDialog.Builder(this).setTitle("title").setMessage("message").create().show();
-1
ответ дан 24 November 2019 в 13:50
поделиться

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

Лучшее описание диалогов в Android, которое я видел, находится в "Pro Android" http://www.apress.com/book/view/1430215968

Это не идеальное объяснение, но оно должно помочь вы должны понять различия между диалогами в Windows и Android. В Windows вы хотите сделать A, задать вопрос в диалоговом окне, а затем выполнить B или C. В дизайне Android A со всем кодом, который вам нужен для B и C, в onClick () OnClickListener (s) для диалогового окна . Затем сделайте A и запустите диалог. Вы закончили с A! Когда пользователь нажимает кнопку, выполняется B или C.

Windows
-------
A code
launch dialog
user picks B or C
B or C code
done!

Android
-------
OnClick for B code (does not get executed yet)
OnClick for C code (does not get executed yet)
A code
launch dialog
done!
user picks B or C
5
ответ дан 24 November 2019 в 13:50
поделиться

Вы настраиваете слушателей на кнопки. dismis dialog и сделайте свое действие. Не нужно ничего останавливать

protected Dialog onCreateDialog(int id) {
  return new AlertDialog.Builder(this).setTitle(R.string.no_connection).setIcon(android.R.drawable.ic_dialog_alert).setView(textEntryView).setPositiveButton(R.string.exit, new DialogInterface.OnClickListener() 
{

   public void onClick(DialogInterface dialog, int whichButton) {

  // Here goes what you want to do
  }

})
}

для вызова - например, showDialog (DIALOG_ERROR_PREF);

Подробнее http://developer.android.com/guide/topics/ui/dialogs.html

0
ответ дан 24 November 2019 в 13:50
поделиться

В Android диалоги асинхронны, поэтому вам придется структурировать свой код немного иначе.

Итак, в C # ваша логика выполнялась в псевдокоде примерно так:

void doSomeStuff() {
    int result = showDialog("Pick Yes or No");

    if (result == YES) {
        //do stuff for yes
    }
    else if (result == NO) {
        //do stuff for no
    }

    //finish off here
}

Для Android это должно быть менее изящным. Подумайте об этом так. У вас будет OnClickListener , подобный этому:

public void onClick(DialogInterface dialog, int whichButton) {
   if (whichButton == BUTTON_POSITIVE) {
      doOptionYes();
   }
   else if (whichButton == BUTTON_NEGATIVE) {
      doOptionNo();
   }
}

Который затем будет поддерживаться следующими методами:

void doOptionYes() {
    //do stuff for yes
    endThings();
}

void doOptionNo() {
    //do stuff for no
    endThings();
}

void endThings() {
    //clean up here
}

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

11
ответ дан 24 November 2019 в 13:50
поделиться

В Android структура отличается от .NET:

AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage("Hello!")
       .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
               // Handle Ok
           }
       })
       .setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
           public void onClick(DialogInterface dialog, int id) {
               // Handle Cancel
           }
       })
       .create();

позволит вам диалоговое окно с двумя кнопками, и вы обрабатываете кнопку щелчка с обратными вызовами. Возможно, вы сможете написать какой-нибудь код, чтобы сделать синтаксис более близко напоминать .NET, но диалоговое время жизненного цикла довольно переплетается с активностью , поэтому в конце концов, это может быть больше проблем, чем стоит. Дополнительные ссылки на диалоговые окна здесь .

19
ответ дан 24 November 2019 в 13:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: