2010-03-19 4 views
291

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

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

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

http://stackoverflow.com/questions/2028697/dialogs-alertdialogs-how-to-block-execution-while-dialog-is-up-net-style?lq=1 – Mertuarez

+1

Как я resue AlertDialog код и обрабатывать события (да, нет действий) на всех экранах? В .Net мы используем класс Action для обработки событий, есть ли способ реализовать это? Я знаю, используя интерфейсы, мы можем это сделать, но любой альтернативный путь? – Ravikumar11

+1

Да .... мы, разработчики .NET, действительно испытывают трудности с Android. Интересно, является ли Xamarin отличным инструментом? –

ответ

628

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.getContext(), чтобы получить контекст. В качестве альтернативы вы можете использовать yourFragmentName.getActivity().

+3

новый AlertDialog.Builder (это); Ошибка времени компиляции: «Конструктор AlertDialog.Builder (новый View.OnClickListener() {}) не определен« –

+0

, если я хочу отклонить это диалоговое окно, что должно писать в case case DialogInterface.BUTTON_NEGATIVE. –

+0

@VijayBagul 'dialog.dismiss();' – Tushar

32

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

Заканчивать этот вопрос в течение более длительного обсуждения между различиями в Android и .NET (как это относится к диалогам): Dialogs/AlertDialogs: How to "block execution" while dialog is up (.NET-style)

+8

Спасибо, факт, что диалоги Android асинхронны, делает все ясным (и разумным) сейчас. Кажется, мне нужно «придумать .Net» при разработке приложений для Android :) – Solo

+0

FYI: то, что вы называете «асинхронным диалогом», называется термином «немодальный диалог» в терминологии GUI, тогда как «синхронный диалог» называется «модальным диалогом», , Android не содержит модальные диалоги (за исключением очень исключительных случаев). – Alex

+0

Android не позволяет системным модальным диалогам по очень веской причине: не допускается вмешиваться в другие приложения на устройстве. – Renascienza

1

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

108

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

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(); 
+11

Лично мне нравится этот фрагмент кода больше, чем принятый ответ – John

+0

@nikki Почему у обоих есть увольнение()? – likejiujitsu

+1

Это сработало для меня, а затем ответ – Bob21

5

Благодаря 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(); 
+0

У меня сложилось впечатление, что OP не хотел использовать AlertDialog.Builder. OP wats, чтобы узнать, есть ли утилита быстрого доступа, – walrii

+1

Я написал тот же код, но сначала появляется NO, а затем ДА . В основном это диалоговое окно NO/YES, но мне нужно диалоговое окно ДА/НЕТ Как мне это сделать это –

+0

Что касается YES/NO vs NO/YES, см. этот ответ: http://stackoverflow.com/a/13644589/1815624 вы можете манипулировать им, как описано в этом ответе: http://stackoverflow.com/a/13644536/1815624 – CrandellWS

4

Steves ответ является правильным, хотя устаревшие с фрагментами. Вот пример с 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 и использовать его вместо встроенных слушателей.

+0

no endTransaction() необходимо? – likejiujitsu

+0

@likejiujitsu выше достаточно. – Warpzit

+0

Создайте класс FragmentDialog просто для того, чтобы сделать поле «нет»/«да» - это немного переоценить ... :) По умолчанию AlertDialog достаточно справедлив. – Renascienza

0
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(); 
4

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

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(); 
    } 

} 
+0

Спасибо. Это работа для меня – kosala

13

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

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(); 
0

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

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

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); 
} 

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

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 ... 
      } 
     }; 
    } 
} 
1

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

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(); 

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

1

В Котлин:

AlertDialog.Builder(this) 
    .setTitle(R.string.question_title) 
    .setMessage(R.string.question_message) 
    .setPositiveButton(android.R.string.yes) { _, _ -> yesClicked() } 
    .setNegativeButton(android.R.string.no) { _, _ -> noClicked() } 
    .show() 
0

Диалог анонимно, как цепочки команд & без определения другого объекта:

new AlertDialog.Builder(this).setTitle("Confirm Delete?") 
         .setMessage("Are you sure?") 
         .setPositiveButton("YES", 
           new DialogInterface.OnClickListener() { 
            public void onClick(DialogInterface dialog, int which) { 

             // Perform Action & Dismiss dialog         
             dialog.dismiss(); 
            } 
           }) 
         .setNegativeButton("NO", new DialogInterface.OnClickListener() { 
          @Override 
          public void onClick(DialogInterface dialog, int which) { 
           // Do nothing 
           dialog.dismiss(); 
          } 
         }) 
         .create() 
         .show(); 
0

1.Create AlertDialog набор сообщений, название и положительный, отрицательный Кнопка:

final AlertDialog alertDialog = new AlertDialog.Builder(this) 
         .setCancelable(false) 
         .setTitle("Confirmation") 
         .setMessage("Do you want to remove this Picture?") 
         .setPositiveButton("Yes",null) 
         .setNegativeButton("No",null) 
         .create(); 

2. Теперь найдите обе кнопки на DialogInterface Нажмите, затем setOnClic kListener():

alertDialog.setOnShowListener(new DialogInterface.OnShowListener() { 
      @Override 
      public void onShow(DialogInterface dialogInterface) { 
       Button yesButton = (alertDialog).getButton(android.app.AlertDialog.BUTTON_POSITIVE); 
       Button noButton = (alertDialog).getButton(android.app.AlertDialog.BUTTON_NEGATIVE); 
       yesButton.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         //Now Background Class To Update Operator State 
         alertDialog.dismiss(); 
         Toast.makeText(GroundEditActivity.this, "Click on Yes", Toast.LENGTH_SHORT).show(); 
         //Do Something here 
        } 
       }); 

       noButton.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View view) { 
         alertDialog.dismiss(); 
         Toast.makeText(GroundEditActivity.this, "Click on No", Toast.LENGTH_SHORT).show(); 
         //Do Some Thing Here 
        } 
       }); 
      } 
     }); 

3.To Показать Alertdialog:

alertDialog.show(); 

Примечания: Не забывайте Окончательные слова с AlertDialog.