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_UP
或 ACTION_CANCEL
事件发生时再次打开,因为您的对话框是现在挡住了视线。尝试按如下方式更改 onTouch
方法:
public boolean onTouch(View arg0, MotionEvent arg1) {
if (arg1.getActionMasked() == MotionEvent.ACTION_UP)
showTimeDialog();
return false;
}
调用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_UP
或 ACTION_CANCEL
事件发生时再次打开,因为您的对话框是现在挡住了视线。尝试按如下方式更改 onTouch
方法:
public boolean onTouch(View arg0, MotionEvent arg1) {
if (arg1.getActionMasked() == MotionEvent.ACTION_UP)
showTimeDialog();
return false;
}