在解除TimePickerDialog时也会调用OnTimeSet

Ale*_*aro 26 android timepicker

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

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

我使用的API是18.

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

Ank*_*ary 35

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

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

  • 但这个逻辑在三星4.0.4版本中不起作用.view.isShown()始终返回false. (2认同)

Ton*_*ony 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();
Run Code Online (Sandbox Code Playgroud)

  • 在三星4.0.4版本.onTimeSet()只会被调用一次.所以,你的逻辑将不再起作用.你应该在那里进行版本检查. (3认同)

leo*_*eon 5

重申:这是Android中针对多种Dialog类型的已确认错误.已经建议了两种解决方法,将状态保存在(实例)变量中或者询问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
    }
}
Run Code Online (Sandbox Code Playgroud)

它干净而有效.