Intereting Posts
FragmentTransaction: replace и addToBackStack не работают вместе? Android Calendar View для Date Picker Android SDK Manager не загружает последнюю платформу Android SDK (API 17) Android: токен Firebase при первом запуске равен нулю Учет ссылок Butterknife после завершения операции? Android AppCompat 22.1.1 цвет текста по умолчанию и стиль ActionMode Цвет фона Android ListView всегда показывает серый цвет Как я могу подавить анонимный новый runnable () можно заменить лямбдой API Android Google Maps v2 – перетаскиваемые и видимые методы MarkerOptions Ошибка cmake с андроидом ndk ClassNotFoundException для пользовательского ImageView в приложении для Android Сохранение и восстановление состояния пользовательского интерфейса Fragment при нажатии и выталкивании из задней части экрана Ошибка проигрывателя Android Media (1, -4) при воспроизведении аудио из папки «Активы» ANDROID – как проверить, работает ли анимация перед запуском новой анимации Android Maven Eclipse по-прежнему не может импортировать apklib

Как отобразить диалоговое окно «Да / Нет» на Android?

Да, я знаю, что есть AlertDialog.Builder, но я в шоке, знаю, как сложно (ну, по крайней мере, не программист-дружелюбно) отображать диалог на Android.

Раньше я был разработчиком .NET, и мне интересно, есть ли Android-эквивалент следующего?

if (MessageBox.Show("Sure?", "", MessageBoxButtons.YesNo) == DialogResult.Yes){ // Do something... } 

Solutions Collecting From Web of "Как отобразить диалоговое окно «Да / Нет» на Android?"

AlertDialog.Builder действительно не так сложно использовать. Сначала это немного пугает, но, как только вы немного его использовали, это просто и мощно. Я знаю, вы сказали, что знаете, как его использовать, но в любом случае это просто простой пример:

 DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { switch (which){ case DialogInterface.BUTTON_POSITIVE: //Yes button clicked break; case DialogInterface.BUTTON_NEGATIVE: //No button clicked break; } } }; AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setMessage("Are you sure?").setPositiveButton("Yes", dialogClickListener) .setNegativeButton("No", dialogClickListener).show(); 

Вы также можете повторно использовать DialogInterface.OnClickListener если у вас есть другие поля да / нет, которые должны делать то же самое.

Если вы создаете диалоговое View.OnClickListener из View.OnClickListener , вы можете использовать view.getContext() для получения контекста. Кроме того, вы можете использовать yourFragmentName.getActivity() .

Попробуй это:

 AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Confirm"); builder.setMessage("Are you sure?"); builder.setPositiveButton("YES", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // Do nothing but close the dialog dialog.dismiss(); } }); builder.setNegativeButton("NO", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // Do nothing dialog.dismiss(); } }); AlertDialog alert = builder.create(); alert.show(); 

Ответ Стива Х есть, но вот немного больше информации: причина в том, что диалоги работают так, как они делают, потому что диалоги в Android асинхронны (выполнение не прекращается, когда отображается диалог). Из-за этого вы должны использовать обратный вызов для обработки выбора пользователя.

Проверьте этот вопрос для более продолжительного обсуждения различий в Android и .NET (как это связано с диалоговыми окнами ): Dialogs / AlertDialogs: как «блокировать выполнение» при диалоге вверх (стиль .NET)

Это работает для меня:

 AlertDialog.Builder builder = new AlertDialog.Builder(getApplicationContext()); builder.setTitle("Confirm"); builder.setMessage("Are you sure?"); builder.setPositiveButton("YES", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // Do nothing, but close the dialog dialog.dismiss(); } }); builder.setNegativeButton("NO", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // Do nothing dialog.dismiss(); } }); AlertDialog alert = builder.create(); alert.show(); 

Ответ Стива корректен, хотя и устаревший с фрагментами. Вот пример с FragmentDialog.

Класс:

 public class SomeDialog extends DialogFragment { @Override public Dialog onCreateDialog(Bundle savedInstanceState) { return new AlertDialog.Builder(getActivity()) .setTitle("Title") .setMessage("Sure you wanna do this!") .setNegativeButton(android.R.string.no, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // do nothing (will close dialog) } }) .setPositiveButton(android.R.string.yes, new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // do something } }) .create(); } } 

Чтобы начать диалог:

  FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); // Create and show the dialog. SomeDialog newFragment = new SomeDialog (); newFragment.show(ft, "dialog"); 

Вы также можете позволить классу реализовать onClickListener и использовать это вместо встроенных прослушивателей.

Спасибо nikki, ваш ответ помог мне улучшить существующий, просто добавив мое желаемое действие следующим образом

 AlertDialog.Builder builder = new AlertDialog.Builder(this); builder.setTitle("Do this action"); builder.setMessage("do you want confirm this action?"); builder.setPositiveButton("YES", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { // Do do my action here dialog.dismiss(); } }); builder.setNegativeButton("NO", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { // I do not need any action here you might dialog.dismiss(); } }); AlertDialog alert = builder.create(); alert.show(); 

Спросить человека, хочет ли он позвонить или нет Диалог ..

 import android.app.Activity; import android.app.AlertDialog; import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; import android.os.Bundle; import android.view.View; import android.view.View.OnClickListener; import android.widget.ImageView; import android.widget.Toast; public class Firstclass extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.first); ImageView imageViewCall = (ImageView) findViewById(R.id.ring_mig); imageViewCall.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { try { showDialog("0728570527"); } catch (Exception e) { e.printStackTrace(); } } }); } public void showDialog(final String phone) throws Exception { AlertDialog.Builder builder = new AlertDialog.Builder(Firstclass.this); builder.setMessage("Ring: " + phone); builder.setPositiveButton("Ring", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { Intent callIntent = new Intent(Intent.ACTION_DIAL);// (Intent.ACTION_CALL); callIntent.setData(Uri.parse("tel:" + phone)); startActivity(callIntent); dialog.dismiss(); } }); builder.setNegativeButton("Abort", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.show(); } } 

Благодарю. Я использую API Level 2 (Android 1.1), а вместо BUTTON_POSITIVE и BUTTON_NEGATIVE я должен использовать BUTTON1 и BUTTON2 .

 AlertDialog.Builder altBx = new AlertDialog.Builder(this); altBx.setTitle("My dialog box"); altBx.setMessage("Welcome, Please Enter your name"); altBx.setIcon(R.drawable.logo); altBx.setPositiveButton("Ok", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { if(edt.getText().toString().length()!=0) { // Show any message } else { } } }); altBx.setNeutralButton("Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { //show any message } }); altBx.show(); 

Вы можете реализовать общее решение для принятия решений и использовать в другом случае не только для да / нет и настраивать оповещение с анимацией или макетом:

Что-то вроде этого; Сначала создайте свой класс для передачи данных:

 public class AlertDecision { private String question = ""; private String strNegative = ""; private String strPositive = ""; public AlertDecision question(@NonNull String question) { this.question = question; return this; } public AlertDecision ansPositive(@NonNull String strPositive) { this.strPositive = strPositive; return this; } public AlertDecision ansNegative(@NonNull String strNegative) { this.strNegative = strNegative; return this; } public String getQuestion() { return question; } public String getAnswerNegative() { return strNegative; } public String getAnswerPositive() { return strPositive; } } 

После интерфейса для возврата результата

 public interface OnAlertDecisionClickListener { /** * Interface definition for a callback to be invoked when a view is clicked. * * @param dialog the dialog that was clicked * @param object The object in the position of the view */ void onPositiveDecisionClick(DialogInterface dialog, Object object); void onNegativeDecisionClick(DialogInterface dialog, Object object); } 

Теперь вы можете легко создать utils для доступа (в этом классе вы можете реализовать различную анимацию или настраиваемый макет для предупреждения):

 public class AlertViewUtils { public static void showAlertDecision(Context context, @NonNull AlertDecision decision, final OnAlertDecisionClickListener listener, final Object object) { AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setMessage(decision.getQuestion()); builder.setPositiveButton(decision.getAnswerPositive(), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { listener.onPositiveDecisionClick(dialog, object); } }); builder.setNegativeButton(decision.getAnswerNegative(), new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { listener.onNegativeDecisionClick(dialog, object); } }); android.support.v7.app.AlertDialog dialog = builder.create(); dialog.show(); } } 

И последний вызов в действии или фрагменте; Вы можете использовать это в своем случае или для другой задачи:

 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity); initResources(); } public void initResources() { Button doSomething = (Button) findViewById(R.id.btn); doSomething.setOnClickListener(getDecisionListener()); } private View.OnClickListener getDecisionListener() { return new View.OnClickListener() { @Override public void onClick(View v) { AlertDecision decision = new AlertDecision() .question("question ...") .ansNegative("negative action...") .ansPositive("positive action... "); AlertViewUtils.showAlertDecision(MainActivity.this, decision, getOnDecisionListener(), v); } }; } private OnAlertDecisionClickListener getOnDecisionListener() { return new OnAlertDecisionClickListener() { @Override public void onPositiveDecisionClick(DialogInterface dialog, Object object) { //do something like create, show views, etc... } @Override public void onNegativeDecisionClick(DialogInterface dialog, Object object) { //do something like delete, close session, etc ... } }; } } 

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

 new AlertDialog.Builder(this) .setTitle("Are you sure?") .setMessage("If you go back you will loose any changes.") .setPositiveButton("Yes", (dialog, which) -> { doSomething(); dialog.dismiss(); }) .setNegativeButton("No", (dialog, which) -> dialog.dismiss()) .show(); 

Lambdas в Android требует плагин retrolambda ( https://github.com/event/gradle-retrolambda ), но он очень полезен при написании более чистого кода.