AlertDialog 出现两次

AlertDialog appearing twice

调用showTimeDialog()时,对话框出现两次。当我单击 'ok' 时,有另一个对话框在等待。

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

    timeDialog=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());
            dialog.dismiss();
        }
    })
    .setNegativeButton(android.R.string.cancel,
            new OnClickListener() {

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

onCreate()中,我有:

        editText_time.setOnTouchListener(new View.OnTouchListener() {
        public boolean onTouch(View arg0, MotionEvent arg1) {
            showTimeDialog();
            return false;
        }
    });

在您调用 showTimeDialog() 方法的代码中,您希望它不会 return 除非关闭对话框。如果是这样(你的问题不完整所以我只是部分猜测),那么这是错误的,因为对话框是异步的。

编辑

它工作正常,因为您的对话框被触发了两次。这是因为您在 onTouch() 中执行此操作,然后启动第一个对话框,然后触摸屏幕(因为这会触发触摸事件 ACTION_DOWN),然后您松开触发 ACTION_UP 的手指。为避免这种情况,您可能需要在代码中添加条件,我建议在 ACTION_UP 上做出反应,如下所示:

public boolean onTouch(View v, MotionEvent event) {
    if (event.getActionMasked() == MotionEvent.ACTION_UP) {
        showTimeDialog();
    }
}

你确定它只被调用一次吗?你有没有做任何日志输出?我的猜测是,因为您正在调用 onTouch 中的方法,所以该方法被调用的次数比您想象的要多。

onTouch(View, MotionEvent) 不仅在视图被触摸时被调用。有很多次它被一次按下调用,你可以查看 MotionEvent 文档以查看调用此方法的所有可能操作。

可能发生的情况是 showTimeDialog() 方法在 ACTION_DOWN 事件发生时打开,然后在 ACTION_UPACTION_CANCEL 事件发生时再次打开,因为您的对话框是现在挡住了视线。尝试按如下方式更改 onTouch 方法:

public boolean onTouch(View arg0, MotionEvent arg1) {
    if (arg1.getActionMasked() == MotionEvent.ACTION_UP)
        showTimeDialog();
    return false;
}