【问题标题】:How to make a listener for a datepickers cancel button in Android?如何在Android中为日期选择器取消按钮制作监听器?
【发布时间】:2010-06-26 23:50:47
【问题描述】:

我在 Android 中使用日期选择器让用户选择日期。如果用户选择一个日期并设置它(我可以正常工作),我希望它做一件事,然后如果用户按下日期选择器上的取消按钮(打开日期选择器但然后取消)清除某个文本字段)。

我一直在尝试的方法是制作一个

private DatePickerDialog.OnCancelListener mDateCancelListener =
    new DatePickerDialog.OnCancelListener() {
        public void onCancel(DialogInterface dialog) {
            timeClear(); //method that clears text field
        }

    };

那我做

TimePickerDialog timeDialog = new TimePickerDialog(this,
  mTimeSetListener,
  c.get(Calendar.HOUR),
  c.get(Calendar.MINUTE),
  false);
timeDialog.setOnCancelListener(mTimeCancelListener);

附加监听器。

我的问题是,如果用户按下后退按钮,侦听器就会工作,但如果他们按下取消按钮则不会。我尝试使用关闭侦听器,这很有效,除了即使我设置或取消日期选择器它也会关闭!

当且仅当我按下日期选择器上的取消按钮时,我需要做什么才能让某些事情发生?

【问题讨论】:

  • 我正在尝试做同样的事情,但使用日期选择器。在下面建议的解决方案中,应用程序崩溃是因为 .getButton(TimePickerDialog.BUTTON_NEGATIVE) 返回 null。有没有人可以解决这个问题?

标签: android datepicker


【解决方案1】:

反直觉的唯一解决方案是您需要“覆盖”取消按钮:

    timeDialog.setButton(DialogInterface.BUTTON_NEGATIVE,
            getString(R.string.cancel),
            new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    // do stuff
                }
            });

【讨论】:

  • 这也调用了 OnTimeSet 方法。因此,它依次调用否定侦听器,然后调用肯定侦听器。
【解决方案2】:

好的,经过一些实验,我发现需要的是一个 OnDismissListener,如下所示。请注意,我为 TimePickerDialog 开发了我的解决方案,但 setOnDismissListener 是从 Dialog 继承的,因此它对于 DatePickerDialog 的工作方式应该相同。

timeDialog.setOnDismissListener(mOnDismissListener);


private DialogInterface.OnDismissListener mOnDismissListener =
    new DialogInterface.OnDismissListener() {
        public void onDismiss(DialogInterface dialog) {
            _logger.v("mOnDismissListener called");
            timeClear();
        }
    };

我已经对此进行了测试,并且可以正常工作。实际上,我发现在您提到的两种情况下都会调用 OnDismissListener,即用户单击“取消”按钮和单击硬件后退按钮时。所以你只需要这一个处理程序。

最后,既然我知道要 google 什么,我发现 this article 描述了 OnDismissListener 和 OnCancelListener 之间的区别,在“使用 Dismiss Listeners”一节中:

【讨论】:

  • 这不是所要求的 - 无论按下什么按钮都会触发 onDismiss,但发布者想知道何时按下取消按钮。他们还声明他们已经尝试过 onDismiss 监听器。
  • @barry 好点。我觉得有趣的是“onCancelListener”与 datePicker 对话框上的 Cancel 按钮无关。 W00di 的评论是正确的答案......所以可能重复。
【解决方案3】:

您可以创建一个布尔变量 isDataSet 并在 dateSetListener 中执行 isDataSet = true;然后用这样的代码附加 onDismissListener:

if(isDataSet)
    //Data was set and neither back nor cancel button was clicked
else
    //back or cancel button was clicked

但不要忘记在每次创建对话框时设置 isDataSet = false。

【讨论】:

    【解决方案4】:

    这就是解决方案。它可能对其他人有帮助

     datePickerDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface dialog, int which) {
                if (which == DialogInterface.BUTTON_NEGATIVE) {
                    // do something
                }
            }
        });
    

    【讨论】:

      【解决方案5】:

      试试这个:

      timeDialog.getButton(TimePickerDialog.BUTTON_NEGATIVE).setOnClickListener(mTimeCancelListener);
      

      (您必须更改 mTimeCancelListener 以实现 DialogInterface.OnClickListener 而不是 OnCancelListener

      【讨论】:

      • 感谢您的回复!我还有点小麻烦。如果我创建一个 DialogInterface.OnClickListener 并尝试将它用于 TimePicker,它会告诉我我需要先转换它。如果我这样做了,那么当您单击按钮打开 TimePicker 时程序就会崩溃。如果你不这样做,那么它会说 android.view.View 中的 setOnClickListener(android.view.View.OnClickListener) 不能应用于 (android.content.DialogInterface.OnClickListener) timeDialog.getButton(TimePickerDialog.BUTTON_NEGATIVE).setOnClickListener(dateTimeClickCancelListener) ;
      • 我尝试创建一个 View.OnClickListner() 而不是 DialogInterfaceListener,当我尝试打开 TimePicker 对话框时程序崩溃了
      【解决方案6】:

      完整的解决方案(经过测试和工作)是将 OnDismissListener(参见上面 Kenneth Baltrinic 的回答 3)与 dilix 描述的 onDateSet 布尔值(上面的 1 个回答)结合起来。您需要两者,因为 onDismiss 在所有情况下都使用: (1) 用户选择了实际数据 (2) 用户已取消 (3) 用户点击了硬件返回按钮。

      使用组合可以区分它们。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-25
        • 1970-01-01
        相关资源
        最近更新 更多