AlertDialog в функции, которая имеет возвращаемое значение

Я написал функцию, которая имеет возвращаемое значение типа int, и в этой функции мне нужно открыть AlertDialog двумя кнопками. Когда нажимается кнопка «Да», функция возвращает 0, а кнопка «Нет» возвращает -1.

public int Func(){ final AlertDialog d=new AlertDialog.Builder(mContext).setTitle("Warning").setCancelable(false).setMessage (alert) .setPositiveButton("Yes",mListener).setNegativeButton("No",mListener).create(); d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); d.show(); if(mWhich.getWhich()==-1) //the "yes" button was clicked return 0; else //the "no" button was clicked return -1; } 

MWhich – класс, используемый для записи пользовательских вариантов

 private DialogInterface.OnClickListener mListener = new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { mWhich.setWhich(which); } }; 

Теперь проблема в коде

 if(mWhich.getWhich()==-1) return 0; else return -1; 

Был выполнен до того, как пользователь нажмет кнопку «Да» или «Нет», как мне это сделать?

Как я понял, ваш код похож на

 // some code int result = Func(); DoSmthWithResult(result); // some code 

Ваш Func работает в потоке пользовательского интерфейса, поэтому после создания диалога он продолжает выполнение и возвращает начальное значение mWich . onClickListener этого вы должны вызвать DoSmthWithResult из onClickListener :

 private DialogInterface.OnClickListener mListener = new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { DoSmthWithresult(which == -1 ? 0 : -1); } }; 

Теперь DoSmthWithResult будет выполнен после нажатия пользователем кнопки «да» или «нет».

Я не думаю, что это возможно, как вы это делаете, потому что Func() , вероятно, закончит выполнение, прежде чем пользователь нажмет на любую из кнопок. Было бы невозможно изменить возвращаемое значение метода после его завершения.

Поскольку вы уже сохраняете, используя mWhich.setWhich(which); , Вы можете прочитать значение позже, используя другую функцию.

 private DialogInterface.OnClickListener mListener = new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { mWhich.setWhich(which); } }; public void showDialog() { final AlertDialog d = new AlertDialog.Builder(mContext).setTitle("Warning") .setCancelable(false).setMessage(alert).setPositiveButton("Yes", mListener) .setNegativeButton("No", mListener).create(); d.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); d.show(); } public int func() { if (mWhich.getWhich() == -1) // the "yes" button was clicked return 0; else // the "no" button was clicked return -1; } 

В то время как его, безусловно, способ андроида использовать слушателя и запускать новую иерархию вызовов при щелчке (как предлагал Юрий и Биной), может возникнуть необходимость получить диалог блокировки. Я понял, что, начав новый поток с собственным петлером, который отображает диалог. Таким образом, поток ui можно запускать, но не приводит к ANR.

Мне нужна была такая же функциональность, чтобы отображать диалоговые окна подтверждения, и вот мое обходное решение:

Ваш Func() может походить на мое messageDialog() следующим образом:

  public static void messageDialog( Context context, String title, String bt_ok, String bt_cancel, final Runnable if_ok, final Runnable if_cancel ) { AlertDialog.Builder alert = new AlertDialog.Builder(context); alert.setTitle( title ); alert.setPositiveButton( bt_ok.toUpperCase(), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { if(if_ok!=null) if_ok.run(); } }); alert.setNegativeButton( bt_cancel.toUpperCase(), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { if(if_cancel!=null) if_cancel.run(); } }); alert.show(); } 

И вызовите messageDialog() следующим образом:

  Runnable ifTrue = new Runnable() { @Override public void run() { //put here your YES onClick stuff } }; String msg = "Do you really want to do this?"; ALITEC.Dialogs.messageDialog( this, msg, "Yes", "No", ifTrue, null); 

При нажатии кнопки NO, я ничего не делал … но если вы хотите:

  Runnable ifFalse = new Runnable() { @Override public void run() { //put here your NO onClick stuff } }; 

А затем позвоните

MessageDialog (это, msg, «Да», «Нет», ifTrue, ifFalse);

вместо

MessageDialog (это, msg, «Да», «Нет», ifTrue, null);

Это все!

С наилучшими пожеланиями!

Intereting Posts
Как легко импортировать проект eclipse android в Intellij IDEA 10 Нарисуйте круг в холсте с несколькими цветами градиента Конверсия в формат Dalvik завершилась с ошибкой 1 – После обновления Android SDK & ADT Android: MetricAffectingSpan и RasterizerSpan Не удалось создать внешнюю библиотеку OpenSSL для Android NDK для Windows / Cygwin Android L: ActionBar setHideOnContentScrollEnabled Android :: Установить максимальную длину EditText программно с помощью другого InputFilter Камера java.lang.RuntimeException: setParameters не удалось USB-соединение и отладка одновременно Как загрузить уменьшенную версию изображения? Google OAuth2 – токен доступа и токен обновления -> invalid_grant / Code уже был выкуплен Ошибка Strange NoClassDefFoundError при запуске подписанного выпуска APK с включенной proguard Facebook 3.0 Вторая попытка входа в систему Android возвращает «Состояние сеанса закрыто» Android – SQLiteStatement (множественная вставка) выполняет сбой с API уровня 14 Что такое строгость в android и его использование