Происходя из среды.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
, и затем возвратите значение каждый раз, когда Кнопка нажимается (и диалоговое окно уходит)?
Быть ясным:
Мне нужно, чтобы выполнение остановилось и ожидало, пока пользователь не выбрал кнопку для нажатия во всплывающем окне. Код, которые следуют за вызовом для показа Диалогового окна, зависит от того, какая кнопка нажата в Диалоговом окне.
Вот почему я не могу использовать то, что предлагают 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-методах, и это походит на ад мне.
Другим очевидным примером было бы всплывающее окно, спрашивающее, "Сделать Вы хотите продолжить" опциями "Yes" и "No".
Если пользователь нажимает "Yes", целый метод должен быть прерван иначе, он должен продолжить выполнение. Как Вы решаете это приятно?
Тед, ты действительно не хочешь этого делать :) Самая большая причина в том, что если вы заблокируете поток пользовательского интерфейса во время отображения диалогового окна, вы заблокируете поток, отвечающий за отрисовку и обработку событий ваш диалог. Это означает, что ваш диалог не будет отвечать. Вы также вызовете ошибку ANR, если пользователю потребуется более нескольких секунд, чтобы щелкнуть диалоговое окно.
Ответ Эриха - именно то, что вам нужно. Я знаю, что это не то, что вы хотите , но это не имеет значения. Мы разработали Android, чтобы разработчики не могли писать синхронные диалоги, поэтому у вас действительно нет особого выбора.
Это самый простой способ:
new AlertDialog.Builder(this).setTitle("title").setMessage("message").create().show();
При попытке оптимизировать память и производительность диалоговые окна в 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
Вы настраиваете слушателей на кнопки. 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
В 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
}
Итак, то, что было одним методом, теперь четыре. Это может показаться не таким аккуратным, но, боюсь, именно так оно и работает.
В 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, но диалоговое время жизненного цикла довольно переплетается с активностью
, поэтому в конце концов, это может быть больше проблем, чем стоит. Дополнительные ссылки на диалоговые окна здесь .