为什么AlertDiolog.show()会在Android中产生错误?

时间:2013-07-30 21:55:54

标签: android android-alertdialog

我正在尝试构建一个非常简单的警报对话框流程。我构建了对话框,这样它唯一能做的就是显示警报。但它反而产生错误。

以下是我项目的相关代码:

Button button = (Button)findViewById(R.id.btnCancel);
button.setOnClickListener(new View.OnClickListener() {
  public void onClick(View v) {
    Context appContext = getApplicationContext();                                   
    AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(appContext);                
    alertDialogBuilder.setTitle("Your Title");
    alertDialogBuilder
        .setMessage("Click yes to exit!")
        .setCancelable(false)
        .setPositiveButton("Yes",new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog,int id) {
            try {
              HttpResponse response=RestServicesCaller.cancelTransaction(transactionId);
            } catch (JSONException e) {
              e.printStackTrace();
            } catch (IOException e) {
              e.printStackTrace();
            }
          }
        })
        .setNegativeButton("No",new DialogInterface.OnClickListener() {
          public void onClick(DialogInterface dialog,int id) {
            dialog.cancel();
          }
        });

    AlertDialog alertDialog = alertDialogBuilder.create();
    alertDialog.show();

如果我在按下按钮时注释alertDialog.show(),则没有任何反应(如预期的那样)。但是,如果我按下按钮打开它,它会强制关闭程序。是什么导致这个?

我认为这可能是xml的结果可能......?

2 个答案:

答案 0 :(得分:1)

在创建对话框,祝酒等时不要使用应用程序上下文,而是使用活动上下文。

Button button = (Button)findViewById(R.id.btnCancel);
button.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        new AlertDialog.Builder(MyActivity.this)
            .setTitle("Your Title")
            .setMessage("Click yes to exit!")
            .setCancelable(false)
            .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
                 public void onClick(DialogInterface dialog,int id) {
                    try {
                        HttpResponse response = RestServicesCaller.cancelTransaction(transactionId);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                 }
             })
             .setNegativeButton("No",new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog,int id) {
                    dialog.cancel();
                }
             })
             .show();
    }
});

MyActivity将是您的活动(如果它是一个片段,只需使用getActivity())。 BTW AlertDialog.Builder是一个构建器,意味着您实际上可以使用构建器模式; - )。

这是一篇关于何时使用哪种上下文的优秀文章:http://www.doubleencore.com/2013/06/context/

答案 1 :(得分:0)

以前的回答是正确的https://stackoverflow.com/a/17958395/1326308我认为在你的情况下最好使用 dialog.dismiss()而不是 dialog.cancel() < / p>