2011-12-23 99 views
9

我們有一個成員報告他無法在我們的DatePickerDialog上設置1970年1月1日之前的日期。這個問題不適合我們。DatePickerDialog錯誤地強制實施1970年1月1日的最低日期

我已經知道DatePickerDialog沒有公開基礎DatePicker的setMinDate/setMaxDate函數,所以似乎某種手機制造商特定的修改正在影響minDate/maxDate。

此用戶報告他在運行2.2 Froyo的Verizon上運行Droid x2。雖然我們相信他在描述他的設備模型時是正確的,但許多用戶對操作系統版本感到困惑,所以他可能會跑2.3。

我試圖加入這個主題我的活動來解決這個問題:

<style name="profile_editor_theme">  
    <item name="android:endYear">2025</item> 
    <item name="android:startYear">1910</item> 
</style> 

雖然我的活動這個主題有約束DatePickerDialog在我的測試設備(銀河標籤和原來的預期效果摩托羅拉Droid),它顯然對用戶沒有任何影響。

此問題在100%的時間內爲我們的用戶提供repros,但在我們自己的設備上正常工作。

任何人都可以解釋什麼可能導致這一點,我們如何解決它?

我對這件事情有filed this bug against Google

謝謝!

+0

我們的一些用戶(包括Droid x2用戶)正在報告同樣的問題,我們也無法在內部進行再現。 – greg7gkb 2012-02-07 21:18:50

+0

也在摩托羅拉Razr – HannahMitt 2012-06-13 15:09:24

+0

repros任何人有這方面的更新?我們仍然在現場得到報告...沒有訪問Razr不幸的是:( – greg7gkb 2012-07-30 18:59:54

回答

2

Android設備的開始日期從1970年1月1日開始。也許這可能是您的情況。 Android計算時間爲自1970年1月1日以來經過的毫秒數。

我發現了一種針對您的案例的破解。 在這裏,我動態地創建日期選擇器:

 DatePicker dp = new DatePicker(this); 
    dp.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT)); 
    v.addView(dp); 

在manifest文件中,我宣佈自定義主題我的應用程序 - 我想應用程序的同一主題。順便說一下,你可以爲活動做同樣的事情。

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" 
    android:theme="@style/CustomTheme"> 
    <activity 
     android:name=".HelloDatePickerActivity" 
     android:label="@string/app_name" > 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

在styles.xml我這樣做:

<style name="CustomTheme" parent="android:Theme.Light"> 
    <item name="android:startYear">1890</item> 
</style> 

在我的情況下,默認開始日期是1900年。因此,對於我這種方法效果。

希望這會幫助你!

+3

Just作爲參考,這就是所謂的「Unix時代」或「Unix時間」,這只是我儘量避免使用它的原因之一。更多關於此主題:http://en.wikipedia .org/wiki/Unix_time – 2011-12-23 21:50:45

+0

雖然是,但unixtime通常是設備上時間表示的方法,特別是對於「當前」日期(如文件修改時間),對於DatePicker而言,情況並非如此,該DatePicker具有其自己的內部表示形式,根據這個來源在這裏:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/widget/DatePicker.java#DatePicker – esilver 2011-12-23 22:19:23

+0

我們現在已經用這個解決方案,將看到市場如何響應:) – greg7gkb 2012-02-07 21:43:45

0

我看你已經嘗試過類似的東西,但你有沒有嘗試設置如下:

android:startYear="1900" 

直接在DatePicker XML?

像這樣:

<DatePicker 
      android:startYear="1900" 
      android:endYear="2100" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
></DatePicker> 

參考:http://kevsaidwhat.blogspot.com/2011/10/fun-with-android-datepicker-and-1970.html

+0

我們沒有任何DatePicker XML。 DatePickerDialog是動態構造的。 DatePicker本身是由DatePickerDialog根據此源在這裏分配的:http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/app /DatePickerDialog.java?av=f – esilver 2011-12-23 22:14:52

+0

我似乎無法在文檔中找到以編程方式設置'startDate'參數的方式,對不起... – 2011-12-23 22:26:39

+0

DatePicker源中的每行代碼如下: private static final int DEFAULT_START_YEAR = 1900; 我不應該以編程方式設置它,而且Droid x2能夠這樣做的事實表明有一個錯誤的地方.... – esilver 2011-12-23 23:03:49

0

我意識到這個問題是有點老了,這個答案並不適用於較舊的設備,但我最近一直意識到的這個問題在更新的設備上(華爲Mediapad 7 Youth),所以我想我會更新這個更新的信息:

從API 11開始,必要的方法是暴露的。請記住,儘管Calendar可能使用Unix Epoch作爲零,但Java(至少在〜JRE 8?之前)使用帶符號的數字,因此負數是完全可以接受的。值得慶幸的是,你並不需要充分認識到這一點,因爲這個代碼運行正常:

// This is API 11! 
try { 
    // Hack to (try to) force minDate to 1888 instead of 1970. 
    DatePicker dp = dialog.getDatePicker(); 
    Calendar minCal = Calendar.getInstance(); 
    minCal.set(1888, Calendar.JANUARY, 1, 0, 0, 0); 
    dp.setMinDate(minCal.getTimeInMillis()); 

    if (maxDate > 0) 
     dp.setMaxDate(maxDate); 
} catch (NoSuchMethodError e) { 
    Log.w(TAG, "Can't set min/max dates: device/Android version is too old."); 
} 

我用1888年,這樣的任何報告,說明這是最低將明確該代碼被執行,而不是忽視/覆蓋。我應該注意到我還沒有聽到這個報告的設備是否工作。

0

嗨,我找到了解決方案。你可以在setMinDate()方法中設置-ve值,它適用於我。

dp.setMinDate(-1576800000000L); 
相關問題