如何在Android中为datepickers取消按钮设置监听器?

时间:2010-06-26 23:50:48

标签: android datepicker

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

我一直在努力的方法是制作一个

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);

附加监听器。

我的问题是,如果用户按下后退按钮,则监听器工作,但如果他们按下取消按钮则不行。我尝试使用一个dismiss监听器,这是有效的,除了它是否会关闭,即使我设置或取消了datepicker!

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

6 个答案:

答案 0 :(得分:5)

唯一明智的解决方案是,您需要“覆盖”取消按钮:

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

答案 1 :(得分:2)

您可以创建一个布尔变量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。

答案 2 :(得分:1)

好的,经过一些实验,我发现需要的是一个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”一节中:

答案 3 :(得分:1)

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

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

答案 4 :(得分:0)

试试这个:

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

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

答案 5 :(得分:0)

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

使用该组合可以区分它们。