2010-06-26 59 views
8

我在Android中使用日期选择器让用户选择日期。如果用户选择一个日期并设置它(我可以正常工作),然后在用户按下日期选择器上的取消按钮时清除某个文本字段(打开日期选择器但是取消输出)。如何在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); 

附加监听器。

我的问题是,如果用户按下后退按钮,侦听器将工作,但如果他们按下取消按钮则不会。我尝试了使用dismiss监听器,并且工作,除了事实,即使它是否设置或取消日期选择器!

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

+0

我正在尝试做同样的事情,但与日期选择器。在下面提出的解决方案中,应用程序崩溃,因为.getButton(TimePickerDialog.BUTTON_NEGATIVE)返回null。有没有人有解决这个问题? – 2010-11-21 12:17:43

+1

检查此 [1]:http://stackoverflow.com/questions/2928902/can-we-get-cancel-click-listerner-of-datepicker-dialog – W00di 2013-02-14 10:22:07

回答

0

试试这个:

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

(你必须改变mTimeCancelListener实施DialogInterface.OnClickListener,而不是OnCancelListener)经过一些实验

+0

感谢您的回应!我仍然有点麻烦。如果我创建一个DialogInterface.OnClickListener并尝试将它用于TimePicker,它会告诉我需要先将它投射出去。如果我这样做,那么当你点击按钮打开TimePicker时,程序就会崩溃。 如果你不那么它说,在android.view.View setOnClickListener(android.view.View.OnClickListener)不能适用于(android.content.DialogInterface.OnClickListener) timeDialog.getButton(TimePickerDialog.BUTTON_NEGATIVE) .setOnClickListener(dateTimeClickCancelListener); – Adam 2010-06-27 18:03:49

+0

我尝试创建一个View.OnClickListner()而不是DialogInterfaceListener,并且当我尝试打开TimePicker对话框时程序崩溃 – Adam 2010-06-27 18:14:16

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在你提到的两种场景中都被调用,当用户点击Cancel按钮并且他们点击硬件后退按钮时。所以你只需要这一个处理程序。

最后,现在我知道该怎么谷歌,我发现this article描述差异的OnDismissListener和OnCancelListener之间,在部分“使用辞退监听器”:

+0

这不是要求的 - 无论按下哪个按钮,都会触发onDismiss,但海报想要知道何时按下取消按钮。他们还表示,他们已经尝试了一个onDismiss侦听器。 – barry 2011-11-11 12:46:44

+0

@barry好点..我觉得有趣的是,“onCancelListener”与datePicker对话框上的Cancel按钮无关。 W00di的评论是正确的答案...所以可能重复。 – giulio 2015-10-13 03:09:40

4

唯一的解决办法,直觉,是,你需要“越权”的取消按钮:

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

这也调用OnTimeSet方法。所以按顺序它称负面倾听者然后正面倾听者。 – 2015-05-13 00:05:36

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 =假。

0

完整的解决方案(测试和工作)是将OnDismissListener(见上面的Kenneth Baltrinic的答案3)和dilix描述的onDateSet布尔(上面的答案)结合在一起。 (1)用户已选择实际数据 (2)用户已取消 (3)用户已点击硬件后退按钮。

使用组合使您能够区分它们。

0

这是解决方案。它可以帮助任何一个

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