読者です 読者をやめる 読者になる 読者になる

AlertDialogでボタンを押した時にダイアログを消さない方法

AlertDialog.Builder#setPositiveButtonだとダイアログが消えてしまうので消さない方法。
AlertDialogでViewFliper使いたいときとかに便利なんじゃないかな。

独自ダイアログ作る方がのちのち手をいれること考えると便利だけどね。

もともとはダイアログ表示しているときにToast出したらDialogの上に来るかどうかを検証したかった。

  private void initializeOpenAlert() {

    Button openAlert = (Button) findViewById(R.id.button3);
    openAlert.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View v) {
        AlertDialog.Builder b = new AlertDialog.Builder(MainActivity.this);
        b.setTitle("Title");
        b.setMessage("Text Message");
        b.setCancelable(false);

        // 何にもしてないけどダイアログは勝手に消える
        b.setPositiveButton("Positive", new DialogInterface.OnClickListener() {
          
          @Override
          public void onClick(DialogInterface dialog, int which) {}
        });
        b.setNegativeButton("No.", new DialogInterface.OnClickListener() {
          @Override
          public void onClick(DialogInterface dialog, int which) {}
        });
        b.setNeutralButton("Toast", new DialogInterface.OnClickListener() {
          
          @Override
          public void onClick(DialogInterface dialog, int which) {}
        });
        Dialog d = b.create();
        d.setOnShowListener(new DialogInterface.OnShowListener() {
          @Override
          public void onShow(DialogInterface dialog) {
            AlertDialog d = (AlertDialog)dialog;
            // NEUTRALボタンを取得してView.OnClickListenerで上書き
            d.getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View v) {
                Toast t = Toast.makeText(getApplicationContext(), "Text Text", Toast.LENGTH_LONG);
                t.setGravity(Gravity.CENTER, 0, 0);
                t.show();
              }
            });
          }
        });
        d.show();
      }
    });
  }