未调用TimePickerDialog.onTimeSetListener

nha*_*man 7 android

我正在使用以下代码来显示TimePickerDialog:

TimePickerDialog dialog = new TimePickerDialog(this, new OnTimeSetListener() {

        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
            System.out.println("onTimeSet");
        }
    }, 20, 15, true);
    dialog.setTitle("Test");
    dialog.setButton(TimePickerDialog.BUTTON_POSITIVE, "Done", new OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            System.out.println("Done");
        }
    });
    dialog.setButton(TimePickerDialog.BUTTON_NEGATIVE, "Cancel", new OnClickListener() {

        @Override
        public void onClick(DialogInterface dialog, int which) {
            System.out.println("Cancel");
        }
    });
    dialog.show();
Run Code Online (Sandbox Code Playgroud)

在运行Android 2.3.7的设备上,onTimeSet不会调用该onClick方法(方法可以).在运行4.2.2的设备上,onTimeSet确实会调用它.

这里发生了什么?

小智 16

Android 4.1.1之后TimePickerDialog发生了变化,并且有关于取消TimePickerDialog和DatePickerDialog的错误.请先在这里阅读.默认情况下,您无需设置正负按钮.TimePickerDialog和DatePickerDialog为您处理这些.因此,如果此取消问题对您不重要,请删除正负按钮的设置.如果在用户单击"确定"按钮的情况下删除两个版本中的那些,则将调用onTimeSet方法.

但我建议使用定制的AlertDialog和TimePicker小部件修复bug.

    final TimePicker timePicker = new TimePicker(this);
    timePicker.setIs24HourView(true);
    timePicker.setCurrentHour(20);
    timePicker.setCurrentMinute(15);

    new AlertDialog.Builder(this)
            .setTitle("Test")
            .setPositiveButton(android.R.string.ok, new OnClickListener() {

                @Override
                public void onClick(DialogInterface dialog, int which) {
                    Log.d("Picker", timePicker.getCurrentHour() + ":"
                            + timePicker.getCurrentMinute());
                }
            })
            .setNegativeButton(android.R.string.cancel,
                    new OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog,
                                int which) {
                            Log.d("Picker", "Cancelled!");
                        }
                    }).setView(timePicker).show();
Run Code Online (Sandbox Code Playgroud)