2012-07-08 55 views
18

我的申请于我的Android 2.2模拟器完美的工作。然后我决定在Android 4.1模拟器上测试。 DatePickerDialog看起来有点不同,出于某种原因,当我按下“完成”时,onDateSet()侦听器会被调用两次,并导致我的应用程序出现问题。安卓:安卓4.1模拟器调用onDateSet从两次对话的DatePicker

我知道这是因为在代码如下所示的日志被打印两次,每当我点击 “完成”

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

+3

同样的问题在仿真器上的android 4.1 2012年8月30日,在这里投票https://code.google.com/p/android/issues/detail?id=34860 – Moak 2012-08-30 08:28:47

+0

可能重复[Jelly Bean DatePickerDialog ---是否有一种取消的方法?](http:// stackoverflow。com/questions/11444238/jelly-bean-datepickerdialog-is-there-a-way-to-cancel) – 2013-11-11 09:15:17

回答

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上,这个检查也适用于这些。

+0

是的,这应该工作。我希望他们很快解决这个问题。 – 2012-08-01 07:58:45

+1

将'fired'变量切换回'false',以便DatePicker继续工作。顺便说一句,在TimePicker对话框中也会出现这个问题。 – 2013-02-12 09:29:19

+0

此解决方案概念也适用于TimePicker对话框,在创建时使用类似的“已触发”检查。 – lodlock 2013-04-06 17:58:25

0

我认为这是相关的,我今天开始测试4.1,并发现一些JavaScript事件似乎发生了两次。大多点击此刻。 奇怪的是,如果我在警报中添加“有时”会触发一次。 行为奇怪地不一致。

JavaScript事件只在android 4.1上以这种方式响应。 iPhone看起来很好,因为迄今为止我已经尝试过的所有以前版本的Android(包括4.0.x)。

这似乎是与浏览器或其处理JavaScript以我的方式错误,但是那只是一个猜测。

+0

有没有关于如何解决这个错误的建议?任何解决方法?:) – 2012-07-15 14:28:40

+0

到目前为止我没有发现任何东西。对于上述内容也是额外的,它似乎只是点击或触摸事件。并非所有事件。 (当我得到一些时间),我将创建一个关于android bug列表的bug报告。 – Dan 2012-07-19 17:08:17

1

根据对类似TimePickerDialog问题ANKUR乔杜里的辉煌answer,如果我们检查里面onDateSet如果给定的观点isShown()与否,将解决整个问题与最小的努力,而无需扩大选取器或检查一些可怕的国旗绕来绕去的代码,甚至检查OS版本,只需做到以下几点:

public void onDateSet(DatePicker view, int year, int month, int day) { 
    if (view.isShown()) { 
     // read the date here :) 
    } 
} 

,当然同样可以为onTimeSet做到按ANKUR的答案

0

重申:一世s是Android中的一个确认错误。已经提出了两种解决方法,将状态保存在(实例)变量中或询问对话框是否为isShown()。但isShown()似乎是不可靠的(例如根据this answer's comments),如果你想重新显示对话框,保存状态会变得很混乱。
更好的解决方案是保存对话框本身内的状态:

public void onDateSet(DatePicker picker, int year, int monthOfYear, int dayOfMonth) { 
    if (picker.getTag() == null) { 
     picker.setTag("TAGGED"); 
     // Only gets called once per Dialog 
    } 
} 

它的清洁和有效。