如何使Android中的dateselect器取消button的侦听器?

我在Android中使用dateselect器来让用户selectdate。 我希望它做一件事情,如果用户select一个date,并将其设置(我有这个工作正常),然后清除某个文本字段,如果用户按下dateselect器上的取消button(打开dateselect器,但然后取消)。

我一直在尝试的方式是做一个

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

附加听众。

我的问题是,如果用户按下后退button,监听器工作,但如果他们按下取消button则不会。 我尝试了使用dismiss监听器,而且工作,除了事实,即使我设置或取消dateselect器!

我需要做什么这样,当且仅当我按下我的dateselect器上的取消button时,事情会消失?

Solutions Collecting From Web of "如何使Android中的dateselect器取消button的侦听器?"

唯一的解决办法是直观的,你需要“覆盖”取消button:

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

你可以创build一个布尔variablesisDataSet,并在dateSetListener中执行isDataSet = true; 然后附上onDismissListener这样的代码:

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

但是,每次创build对话框时都不要忘记设置isDataSet = false。

好了经过一番实验,我发现所需要的是一个OnDismissListener,如下所示。 请注意,我为TimePickerDialog开发了我的解决scheme,但是setOnDismissListener从Dialoginheritance,所以它应该与DatePickerDialog相同。

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

我已经testing了这个,它的工作原理。 事实上,我发现OnDismissListener在你提到的两种场景中被调用,当用户点击“取消”button以及当他们点击硬件后退button时。 所以你只需要这个处理程序。

最后,现在我知道该怎么做google了,我发现这篇文章描述了OnDismissListener和OnCancelListener之间的区别,在“使用忽略侦听器”部分:

尝试这个:

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

(你必须改变mTimeCancelListener来实现DialogInterface.OnClickListener而不是OnCancelListener

完整的解决scheme(testing和工作)是将OnDismissListener(见上面Kenneth Baltrinic的答案3)和dilix描述的onDateSet布尔(上面的答案)结合起来。 (1)用户select了实际的数据(2)用户已经取消了(3)用户点击了硬件后退button。

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

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

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