0

本当に単純なアラート ダイアログ プロセスを構築しようとしています。ダイアログを作成して、アラートを表示することだけができるようにしました。しかし、代わりにエラーが発生します。

私のプロジェクトの関連コードは次のとおりです。

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の結果ではないかと思います...?

4

2 に答える 2

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() を使用してください)。ところで、AlertDialog.Builder は、実際にビルダー パターンを使用できることを意味するビルダーです ;-)。

どのコンテキストをいつ使用するかについての優れた記事があります: http://www.doubleencore.com/2013/06/context/

于 2013-07-30T22:13:50.193 に答える
0

前の答えは正しいhttps://stackoverflow.com/a/17958395/1326308であり、あなたの場合、dialog.cancel()の代わりにdialog.dismiss( )を使用する方が良いと思います

于 2013-07-30T22:32:58.713 に答える