Android:Android 4.1模拟器从DatePicker对话框调用onDateSet两次

时间:2012-07-08 13:41:41

标签: android datepicker emulation android-4.2-jelly-bean

我的应用程序在我的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

Working Android 2.2 DatePicker

Android 4.1 DatePicker

Not Working Android 4.1 DatePicker

4 个答案:

答案 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
    }
}

它干净而有效。