【问题标题】:How to display a Yes/No dialog box on Android?如何在 Android 上显示是/否对话框?
【发布时间】:2011-01-29 12:40:45
【问题描述】:

是的,我知道有 AlertDialog.Builder,但我很震惊地知道在 Android 中显示对话框有多么困难(嗯,至少对程序员不友好)。

我曾经是一名 .NET 开发人员,我想知道是否有以下 Android 等效项?

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

【问题讨论】:

  • 我如何重新启动 AlertDialog 代码并处理所有屏幕中的事件(是的,无操作)?在.Net中我们使用Action类来处理事件,有什么方法可以实现吗?我知道使用接口我们可以做到这一点,但还有其他方法吗?
  • 是的....我们.NET开发人员确实很难使用android....我想知道Xamarin是不是一个很棒的工具?

标签: android android-alertdialog


【解决方案1】:

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

【讨论】:

  • 新的 AlertDialog.Builder(this);编译时错误:'构造函数 AlertDialog.Builder(new View.OnClickListener(){}) 未定义'
  • 简单而有用,顺便说一句,对话框将在用户单击“是”或“否”按钮后自行关闭。您无需执行任何操作。
  • 我自己,我用过很多次。但我发现在 SO 上查找它实际上更容易、更快捷。这里给出的代码示例非常简单……我真希望 Android 文档看起来像这样。
  • @EricLeschinski 可能“这个”不是上下文,试试这个:AlertDialog.Builder builder = new AlertDialog.Builder(getView().getContext());
  • @davidglorioso 是/否或否/是的顺序取决于Android的版本,您无法控制它。我不记得它是什么时候改变的,但我认为它是在 4.x 或 5 中。这么说,你不应该改变它。所有使用标准警报对话框的应用程序都将使用相同的否/是按钮顺序,如果您的不同,用户会感到困惑。如果您真的希望它与众不同,则必须根据 Android 版本手动设置正/负按钮。
【解决方案2】:

试试这个:

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

【讨论】:

  • 就个人而言,我更喜欢该代码 sn-p 而不是接受的答案
  • @nikki 为什么两者都有dismiss()?
  • The constructor AlertDialog.Builder(MainActivity.DrawerItemClickListener) is undefined
  • @likejiujitsu 那是因为您在完成工作后无论如何都想从内存中清除对话框。
  • @nikki 如何在 onClick 中获取自定义参数?
【解决方案3】:

Steve H 的回答很准确,但这里有更多信息:对话框以它们的方式工作的原因是因为 Android 中的对话框是异步的(显示对话框时执行不会停止)。因此,您必须使用回调来处理用户的选择。

查看这个问题,详细了解 Android 和 .NET 之间的差异(因为它与对话框有关): Dialogs / AlertDialogs: How to "block execution" while dialog is up (.NET-style)

【讨论】:

  • 谢谢,Android 对话框是异步的这一事实现在让一切变得清晰(并且合理)。在为 Android 开发应用程序时,我似乎需要“从 .Net 中思考”:)
  • 仅供参考:您所说的“异步对话框”在 GUI 术语中称为“无模式对话框”,而“同步对话框”称为“模态对话框”。 Android 没有模态对话框(非常特殊的情况除外)。
  • Android 不允许系统模式对话框有一个很好的理由:不允许干扰设备上的其他应用程序。
【解决方案4】:

这对我有用:

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

【讨论】:

    【解决方案5】:

    询问一个人他是否想打电话给Dialog..

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

    【讨论】:

      【解决方案6】:

      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 并使用它来代替嵌入式侦听器。

      【讨论】:

      • @likejiujitsu 以上就足够了。
      • 创建一个 FragmentDialog 类只是为了做一个否/是框有点过度设计...... :) 默认的 AlertDialog 是公平的,但是。
      • @Renascienza 是的,但我相信它已经过时了。
      • 我的建议是:如果您不仅需要重用布局,还需要重用背景和生命周期代码,请使用片段对话框。使用片段,您可以获得相关的活动生命周期控制,并且可以对创建(因为当用户旋转他的设备时重新创建 UI)、暂停、恢复等事件做出反应。简而言之,一个带有一些详细 UI 的对话框。如果您不需要这个并且您的对话框非常简单,那么常规对话框可以正常工作。
      • @TJJ 基本上,您只需在某处创建一个方法,然后从 onClick 侦听器中调用所述方法。我建议参加一些基本的编码课程等。这是非常基本的。
      【解决方案7】:

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

      【讨论】:

      • 我的印象是 OP 不想使用 AlertDialog.Builder。 OP 想知道是否有快捷实用方法,
      • 我写了相同的代码,但先出现 NO 然后出现 YES 基本上这是一个 NO / YES 对话框,但我需要一个 YES / NO 对话框我该怎么做
      • 至于 YES/NO vs NO/YES 看到这个答案:stackoverflow.com/a/13644589/1815624 你可以按照这个答案中的描述来操作它:stackoverflow.com/a/13644536/1815624
      【解决方案8】:

      在 Kotlin 中:

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

      【讨论】:

        【解决方案9】:

        这里的所有答案都归结为冗长且不利于阅读的代码:正是提问者试图避免的。对我来说,最简单的方法是在这里使用 lambda:

        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 中的 Lambda 需要 retrolambda 插件 (https://github.com/evant/gradle-retrolambda),但无论如何它对于编写更简洁的代码非常有帮助。

        【讨论】:

          【解决方案10】:

          将对话框匿名显示为命令链并且不定义另一个对象:

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

          【讨论】:

            【解决方案11】:

            Kotlin 实现。

            你可以像这样创建一个简单的函数:

            fun dialogYesOrNo(
                    activity: Activity,
                    title: String,
                    message: String,
                    listener: DialogInterface.OnClickListener
                ) {
                    val builder = AlertDialog.Builder(activity)
                    builder.setPositiveButton("Yes", DialogInterface.OnClickListener { dialog, id ->
                        dialog.dismiss()
                        listener.onClick(dialog, id)
                    })
                    builder.setNegativeButton("No", null)
                    val alert = builder.create()
                    alert.setTitle(title)
                    alert.setMessage(message)
                    alert.show()
                }
            

            然后这样称呼它:

            dialogYesOrNo(
              this,
              "Question",
              "Would you like to eat?",
              DialogInterface.OnClickListener { dialog, id ->
                // do whatever you need to do when user presses "Yes"
              }
            })
            

            【讨论】:

            • 一切都很好,直到用户在弹出窗口仍然打开的情况下离开应用程序,如果系统在后台杀死应用程序,将得到一个 WindowLeaked 异常
            【解决方案12】:

            谢谢。我使用 API Level 2 (Android 1.1) 而不是 BUTTON_POSITIVEBUTTON_NEGATIVE 我必须使用 BUTTON1BUTTON2

            【讨论】:

              【解决方案13】:

              1.Create AlertDialog 设置消息、标题和Positive、Negative Button:

              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上的两个按钮单击然后setOnClickListener():

              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.显示警报对话框:

              alertDialog.show();
              

              注意:不要忘记使用 AlertDialog 的最终关键字。

              【讨论】:

                【解决方案14】:

                对于 Android 中的 Kotlin::

                    override fun onBackPressed() {
                        confirmToCancel()
                    }
                
                    private fun confirmToCancel() {
                        AlertDialog.Builder(this)
                            .setTitle("Title")
                            .setMessage("Do you want to cancel?")
                            .setCancelable(false)
                            .setPositiveButton("Yes") {
                                dialog: DialogInterface, _: Int ->
                                dialog.dismiss()
                                // for sending data to previous activity use
                                // setResult(response code, data)
                                finish()
                            }
                            .setNegativeButton("No") {
                                dialog: DialogInterface, _: Int ->
                                dialog.dismiss()
                            }
                            .show()
                    } 
                

                【讨论】:

                  【解决方案15】:
                  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();  
                  

                  【讨论】:

                    【解决方案16】:

                    您可以为决策实施通用解决方案,并在另一种情况下使用,而不仅仅是是/否,并使用动画或布局自定义警报:

                    类似这样的东西;首先为传输数据创建你的类:

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

                    【讨论】:

                      【解决方案17】:

                      你可以在 Kotlin 中轻松做到这一点:

                       alert("Testing alerts") {
                          title = "Alert"
                          yesButton { toast("Yess!!!") }
                          noButton { }
                      }.show()
                      

                      【讨论】:

                        猜你喜欢
                        • 1970-01-01
                        • 2011-01-08
                        • 1970-01-01
                        • 2016-05-21
                        • 2023-03-05
                        • 1970-01-01
                        • 1970-01-01
                        • 2011-01-09
                        相关资源
                        最近更新 更多