2012-07-08 91 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 
    } 
} 

它的清潔和有效。