在解除TimePickerDialog时也会调用OnTimeSet

时间:2013-10-18 15:08:45

标签: android timepicker

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

  1. 当对话框被解除时(例如,通过单击外部)
  2. ,也会调用OnTimeSet
  3. 当用户点击“完成”按钮时,会调用OnTimeSet两次
  4. 我使用的API是18。

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

4 个答案:

答案 0 :(得分:34)

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

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

答案 1 :(得分:16)

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

方法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();

答案 2 :(得分:2)

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

答案 3 :(得分:1)

感谢Tony发布解决方法。这适用于大多数时间,但并非总是如此。我们已经使用此解决方法发布了我们的应用程序(以及版本检查);但是这款解决方案在Samsung 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
                    }

希望它可以帮助别人。