我的应用程序在我的Android 2.2模拟器上运行得很好。然后我决定在Android 4.1模拟器上进行测试。 DatePickerDialog
看起来有点不同,出于某种原因,当我按下“完成”时,onDateSet()
监听器被调用两次并导致我的应用程序出现问题。
我知道这一点,因为每当我点击“完成”
时,代码中显示的日志就会被打印两次mDateSetListener = new DatePickerDialog.OnDateSetListener() {
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
Log.v("onDateSet", "ENTERED");
//rest of code...
}};
Android 2.2 DatePicker
Android 4.1 DatePicker
答案 0 :(得分:24)
尝试设置布尔值以检查同一对话框中的双击。类似于:
Calendar c = Calendar.getInstance();
c.add(Calendar.DAY_OF_YEAR, 1);
final DatePickerDialog dateDialog = new DatePickerDialog(this, new DatePickerDialog.OnDateSetListener() {
boolean fired = false;
public void onDateSet(final DatePicker view, final int year, final int monthOfYear, final int dayOfMonth) {
Log.i("PEW PEW", "Double fire check");
if (fired) {
Log.i("PEW PEW", "Double fire occured. Silently-ish returning");
return;
} else {
//first time fired
fired = true;
}
//Normal date picking logic goes here
}
}, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.DAY_OF_MONTH));
dateDialog.show();
这个双重问题也发生在TimePickerDialog的onTimeSet上,这个检查也适用于那些。
答案 1 :(得分:1)
根据Ankur Chaudhary关于类似TimePickerDialog
问题的精彩answer,如果我们在onDateSet
内查看给定视图isShown()
,它将会以最小的努力解决整个问题,无需扩展选择器或检查代码周围的一些可怕的标志,甚至检查操作系统版本,只需执行以下操作:
public void onDateSet(DatePicker view, int year, int month, int day) {
if (view.isShown()) {
// read the date here :)
}
}
当然,根据Ankur的回答onTimeSet
也可以这样做
答案 2 :(得分:0)
我认为这是相关的,我今天开始在4.1上进行测试,发现一些javascript事件似乎发生了两次。大多数时候点击此刻。 奇怪的是,如果我添加警报,它“有时”会发射一次。 这种行为奇怪地不一致。
javascript事件只在android 4.1上以这种方式响应。 iPhone看起来很好,因为到目前为止我已尝试过所有以前版本的android(包括4.0.x)。
这似乎是浏览器的错误或者它对我处理javascript的方式,但这只是猜测。
答案 3 :(得分:0)
重申:这是Android中已确认的错误。已经建议了两种解决方法,将状态保存在(实例)变量中,或者询问对话框isShown()
。但isShown()
似乎不可靠(例如根据this answer's comments),如果你想重新显示对话框,保存状态会变得混乱。
更好的解决方案是将状态保存在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
}
}
它干净而有效。