TimePickerDialog取消按钮

我有一个活动 – TimePickerActivity – 它创建一个TimePickerDialog。 我有一个onTimeSetListener响应设置按钮在它结束时调用finish()并返回到调用TimePickerActivity的活动。 我希望它完成并返回,如果取消按钮被点击,但无法find任何方式来做到这一点。 我GOOGLE了一遍,尝试了整体的建议,但没有一个似乎工作。 任何简单的方法来做到这一点?

只要将一个onCancelListener传递给TimePicker.setOnCancelListener()

编辑:在Ron的实现问题之后,我决定实际测试自己的代码(我只是回头看看API),而且我发现,即使代码是正确的(我想你的代码编译的时候我有一个错字)点击取消按钮它没有按照预期作出响应…

看起来,当你点击cancel按钮时,对话框不会调用启动OnCancelListenercancel()方法,因为它看起来很明显,但是引发OnDismissListenerdismiss()方法很奇怪。

所以这段代码对我来说工作的很好:

 TimePickerDialog.OnTimeSetListener mTimeSetListener = new OnTimeSetListener() { public void onTimeSet(TimePicker view, int hourOfDay, int minute) { //time set stuff } }; TimePickerDialog myTPDialog = new TimePickerDialog(this,mTimeSetListener,0,0,false); myTPDialog.setOnDismissListener(new OnDismissListener() { public void onDismiss(DialogInterface dialog) { // Cancel code here } }); myTPDialog.show(); 

所有学分到这个答案…

这是我是如何做到的:

 TimePickerDialog tp = new TimePickerDialog(this, mTimeSetListener, 0, 0, false); tp.setButton(DialogInterface.BUTTON_NEGATIVE, "Cancel", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { if (which == DialogInterface.BUTTON_NEGATIVE) { tbTimer.setChecked(false); } } }); 

我的解决方案基于@ maid450答案,@Fortega的注释以及OnDismissListener在显示时间选择器对话框时被任何点击调用(通常在最后一个回合中)的事实。

 private int timeSetStatus; // A clicked button result. ... timeSetStatus = 0; final Calendar calendar = Calendar.getInstance(); final TimePickerDialog dialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { calendar.set(Calendar.HOUR_OF_DAY, hourOfDay); calendar.set(Calendar.MINUTE, minute); calendar.set(Calendar.SECOND, 0); timeSetStatus = 1; // Other actions. } }, calendar.get(Calendar.HOUR_OF_DAY), 0, true); dialog.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { timeSetStatus = 2; // Actions on clicks outside the dialog. } }); dialog.setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { if (timeSetStatus == 0) { // Actions on Cancel button click. } } }); dialog.show(); 

我刚刚覆盖(kotlin示例代码)

 override fun onCancel(dialog: DialogInterface?) { super.onCancel(dialog) callback?.onCancelClick() } 

方法在我的DialogFragment内,并调用onCancelClick我的界面:

 interface SetAlarmTimeListener: TimePickerDialog.OnTimeSetListener { fun onCancelClick() } 
 TimePickerDialog.OnTimeSetListener timePickerListener = new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hour, int minute) { //ok button clicked } }; Calendar c = Calendar.getInstance(); int now_hour = c.get(Calendar.HOUR_OF_DAY); int now_minutes = c.get(Calendar.MINUTE); final TimePickerDialog timePickerDialog = new TimePickerDialog(this, timePickerListener, now_hour, now_minutes + 1, false); timePickerDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialog) { //cancel button clicked } }); timePickerDialog.show(); 

最后一个运行解决方案

在类中声明一个布尔variables如下:

 private boolean isTimeSelected; 

然后在按钮上点击以下方法调用:

 public void onButtonClicked() { TimePickerDialog timePickerDialog = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP || isTimeSelected) { lastSelectedHour = selectedHour; lastSelectedMinute = selectedMinute; // perform OK button tasks } } }, lastSelectedHour, lastSelectedMinute, true); timePickerDialog.setOnCancelListener(new DialogInterface.OnCancelListener() { @Override public void onCancel(DialogInterface dialogInterface) { // perform CANCEL button tasks } }); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { timePickerDialog.setButton(DialogInterface.BUTTON_POSITIVE, "OK", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialogInterface, int which) { if (which == DialogInterface.BUTTON_POSITIVE) { isTimeSelected = true; } } }); timePickerDialog.setButton(DialogInterface.BUTTON_NEGATIVE, "CANCEL", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialogInterface, int which) { if (which == DialogInterface.BUTTON_NEGATIVE) { isTimeSelected = false; } } }); timePickerDialog.setCancelable(false); timePickerDialog.setTitle("Select Time"); } timePickerDialog.show(); }