在解除TimePickerDialog时也会调用OnTimeSet

今天我试图使用TimePickerDialog但我注意到了一些缺陷。

  1. 在关闭对话框时也会调用OnTimeSet(例如,通过单击外部)
  2. 当用户点击“完成”按钮时,OnTimeSet被调用两次

我使用的API是18。

其他人都遇到过这些问题吗? 你是怎么解决的?

今天面对完全相同的问题。 无法弄清楚为什么会这样,但find了一个简单的解决方案:

方法onTimeSet()在关闭对话框时调用一次,在单击完成按钮时调用两次。 无论哪种方式,都会对onTimeSet()进行一次不必要的调用。 所以我决定总是忽略第一个电话。

这是代码:

 Calendar mcurrentTime = Calendar.getInstance(); int hour = mcurrentTime.get(Calendar.HOUR_OF_DAY); int minute = mcurrentTime.get(Calendar.MINUTE); TimePickerDialog mTimePicker; mTimePicker = new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener() { int callCount = 0; //To track number of calls to onTimeSet() @Override public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute) { if(callCount == 1) // On second call { timeString = selectedHour + ":" + selectedMinute + ":00"; Log.d("TEST", "Chosen time : "+ timeString); } callCount++; // Incrementing call count. } }, hour, minute, true); mTimePicker.setTitle("Pick Time"); mTimePicker.show(); 

你应该使用已经给定的View类方法:

 new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hour, int minute) { if (view.isShown()) { // This method will return true only once... } } }; 

重申:这是Android中针对多种Dialogtypes的已确认错误。 已经建议了两种解决方法,将状态保存在(实例)variables中,或者询问Dialog是否为isShown() 。 但isShown()似乎在Android 4.0.4中是不可靠的,如果你想重新显示对话框,保存状态会变得混乱。
更好的解决方案是将状态保存在Dialog本身内,因为它是调用方法的同一实例:

 public void onDateSet(DatePicker picker, int year, int monthOfYear, int dayOfMonth) { if (picker.getTag() == null) { picker.setTag("TAGGED"); // Only gets called once per Dialog } } 

它干净而有效。

使用count来避免它。 当TimePickDialog被选中两次以上时,它也应该运行良好。

  TimePickerDialog tpd = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() { int count = 0; @Override public void onTimeSet(TimePicker view, int setHour, int setMinute) { if(count % 2 == 0) { //set time here } count++; } }, hour, minute, true); 

感谢Tony发布解决方法。 这适用于大多数时间,但并非总是如此。 我们已经使用此解决方法发布了我们的应用程序(以及版本检查); 然而这个解决方案在三星Galaxy Note GT-8000(Android 4.4.2)上失败了。 默认的4.4.2设备有这个bug并且解决方案有效,但是三星似乎已经在4.4.2版本中解决了这个问题所以onTimeSet()只被调用一次我们忽略并且第二次调用从未发生过。

我们正在发布我们今天申请的解决方案。 虽然我对解决方案不满意,因为它是另一个黑客/解决方法,但它可能有助于版本检查没有帮助和OEM合并选择性修复的情况。

我们早先的实施是

  if((android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) && (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)){ if(ccount == 1){ // Do Your Processing count = 0; }else{ // Ignore event. Bug in Android API count++; } }else{ // Do Your Processing } 

我们的新实施是

  if((android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.ICE_CREAM_SANDWICH) && (android.os.Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP)){ StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace(); StackTraceElement e = stacktrace[4]; String methodName = e.getMethodName(); if(methodName.equals("onClick")){ // Do Your Processing }else{ // Ignore event. Bug in Android API } }else{ // Do Your Processing } 

希望它可以帮助别人。