如何使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时,事情会消失?

  • 从单个对话框片段获取date和时间select器值,并将其设置为EditText
  • 在Androiddateselect器中禁用将来的date
  • 如何将DatePicker小部件与其他日历系统一起提供?
  • 如何更改Android DatePicker对话框的“分隔线”颜色
  • 如何只用月份和年份字段显示android的日期选择器?
  • 在Android中将date和时间转换为毫秒
  • Android的,有没有什么办法来禁用使用键盘dateselect器内写入?
  • 为什么Android的原生HTML5dateselect器上的Chrome变得非常慢?
  • 唯一的解决办法是直观的,你需要“覆盖”取消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 } } });