【问题标题】:Which button was clicked in a confirmation dialog在确认对话框中单击了哪个按钮
【发布时间】:2016-07-09 15:40:05
【问题描述】:

我无法获得自定义确认对话框的“结果”。
我构建了以下类:

public class MessageDialog {
  private static int result;

  public static final int OK = 0;
  public static final int CANCEL = 1;

  public static int showConfirmDialog(Context context, String message) {
    result = OK;

    AlertDialog.Builder ad = new AlertDialog.Builder(context);
    ad.setCancelable(false);
    ad.setMessage(message);
    ad.setTitle("Confirm");
    ad.setPositiveButton("Yes", new ButtonPressedListener());
    ad.setNegativeButton("No", new ButtonPressedListener());
    ad.create().show();

    return result;
  }

  private static class ButtonPressedListener implements DialogInterface.OnClickListener {
    @Override
    public void onClick(DialogInterface dialog, int which) {
      if (which == DialogInterface.BUTTON_POSITIVE) {
        result = OK;
      } else {
        result = CANCEL;
      }
      dialog.dismiss();
    }
  }
}

并从 MainActivity 调用它:

if (MessageDialog.showConfirmDialog(this, "Do you want to delete?") == MessageDialog.OK) {
  // yes button was clicked
} else {
  // no button was clicked
}

但是我点击哪个按钮并不重要,我总是得到点击是按钮的结果。

【问题讨论】:

    标签: android dialog


    【解决方案1】:

    这是因为 show() 方法异步显示警报,因此您的 showConfirmDialog() 方法总是返回 OK 值,然后您才能通过点击任何按钮进行更改。 为避免这种情况,您可以在 onClick() 方法中处理不同的按钮行为

    例如:

    @Override
    public void onClick(DialogInterface dialog, int which) {
      switch(which) {
        case DialogInterface.BUTTON_POSITIVE:
          // yes button behavior
          break;
        case DialogInterface.BUTTON_NEGATIVE:
          // no button behavior
          break;
      }
    
      dialog.dismiss();
    }
    

    【讨论】:

    • 我不明白你的意思,你能举个小例子吗?
    • 好的,但是在您的示例中,我必须知道应该通过单击按钮来执行哪些代码。但是在我的应用程序中,我想在不同情况下从不同的活动中调用确认对话框。那么按钮处理程序如何知道要执行什么?
    • @altralaser 在您的特定实现中,您可以例如实现不同的侦听器,然后根据需要将它们传递给构建器。但是,如果您想要更可靠的方法,请查看此处的解决方案:stackoverflow.com/questions/23408756/…
    • 经过大量研究后,我认为对我来说最好的方法是定义一个回调接口并将其作为 showConfirmDialog 方法的附加参数,以便按钮处理程序可以访问正确的业务逻辑,不是吗?它与标准 Java 工具包中的方式有​​点不同,但它可以工作。
    • 听起来不错。希望我的回答对您的研究有所帮助
    猜你喜欢
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    相关资源
    最近更新 更多