我在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!
当且仅当我在我的日期选择器上按下取消按钮时,我需要做什么让某些事情发生?
答案 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)用户点击硬件后退按钮。
使用该组合可以区分它们。