2011-12-23 11 views
9

Abbiamo un membro che segnala di non essere in grado di impostare una data prima del 1 gennaio 1970 sul nostro DatePickerDialog. Questo problema non viene riprodotto per noi.DatePickerDialog che applica in modo errato una data minima del 1 gennaio 1970

Sono già consapevole del fatto che DatePickerDialog non espone le funzioni setMinDate/setMaxDate del DatePicker sottostante, quindi sembrerebbe che una sorta di modifica specifica del produttore abbia effetto sul minDate/maxDate.

Questo utente segnala che sta eseguendo un Droid x2 su Verizon con 2.2 Froyo in esecuzione. Mentre crediamo che sia corretto nella sua descrizione del suo modello di dispositivo, molti utenti sono confusi sulla versione del sistema operativo, quindi potrebbe essere in esecuzione 2.3.

ho tentato di risolvere questo problema con l'aggiunta di questo tema per la mia attività:

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

Mentre questo tema sulla mia attività ha avuto l'effetto desiderato di condizionare il DatePickerDialog sui miei dispositivi di prova (una scheda Galaxy e un originale Motorola Droid), apparentemente non ha avuto alcun effetto per l'utente.

Questo problema viene riprodotto per il nostro utente il 100% delle volte, ma funziona correttamente per noi sui nostri dispositivi.

Qualcuno può spiegare che cosa potrebbe causare questo e come possiamo risolvere il problema?

Ho filed this bug against Google su questo argomento.

Grazie!

+0

Lo stesso problema viene segnalato da alcuni dei nostri utenti (incluso un utente Droid x2) e non siamo stati in grado di eseguire la replica in-house. – greg7gkb

+0

Anche repros sul Motorola Razr – HannahMitt

+0

Qualcuno ha aggiornamenti su questo? Stiamo ancora ricevendo rapporti di esso in campo ... non ha accesso ad un Razr purtroppo :( – greg7gkb

risposta

2

La data di inizio dei dispositivi Android inizia dal 1 ° gennaio 1970. Forse questo può essere il tuo caso. Android calcola il tempo trascorso un certo numero di millisecondi dal 1 ° gennaio 1970.

Ho trovato una specie di trucco per il tuo caso. Qui ho creare dinamicamente datepicker:

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

Nel file manifest dichiaro un tema personalizzato per la mia applicazione - Voglio lo stesso tema per l'applicazione. Tra l'altro puoi fare lo stesso per l'attività.

<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> 

In uno styles.xml faccio questo:

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

La data di inizio di default nel mio caso è 1900. Così, per me questo approccio funziona.

Spero che questo ti possa aiutare!

+3

Proprio per riferimento, questo è ciò che viene chiamato "Unix Epoch" o "Unix Time", e questo è solo uno dei motivi per cui cerco di evitare di usarlo il più possibile.Ulteriori informazioni sull'argomento qui: http: //en.wikipedia .org/wiki/Unix_time –

+0

Mentre sì, unixtime è spesso il metodo di rappresentazione del tempo sui dispositivi, specialmente per le date "attuali" (come i tempi di modifica dei file), che non è il caso di un DatePicker, che ha una propria rappresentazione interna, secondo questa fonte qui: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/widget/DatePicker.java#DatePicker – esilver

+0

Noi 'andato con questa soluzione per ora, vedrà come risponde il marketplace :) – greg7gkb

0

vedo hai già provato qualcosa di simile, ma avete provato impostando la seguente:

android:startYear="1900" 

direttamente sul DatePicker XML?

Come così:

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

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

+0

Non abbiamo alcun XML DatePicker. DatePickerDialog è costruito dinamicamente. DatePicker è esso stesso assegnato dal DatePickerDialog come da questa fonte qui: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/app /DatePickerDialog.java?av=f – esilver

+0

io non riesco a trovare nella documentazione un modo per impostare a livello di codice il parametro 'startDate', scusa ... –

+0

per queste righe nell'origine DatePicker: private static int DEFAULT_START_YEAR finale = 1900; Non avrei dovuto programmarlo in modo programmatico, e il fatto che il Droid x2 fosse in grado di farlo indica che c'è un bug in qualche posto .... – esilver

0

Mi rendo conto che questa domanda è un po 'vecchio, e che questa risposta non si applica ai dispositivi più vecchi, ma sono stato di recente a conoscenza di questo problema su un dispositivo più recente (il Huawei Mediapad 7 Youth), quindi ho pensato di aggiornarlo con informazioni più recenti:

A partire dall'API 11, i metodi necessari per eseguire questa operazione sono esposti. Ricorda, mentre Calendar può usare Unix Epoch come zero, Java (almeno fino a ~ JRE 8?) Usa i numeri firmati, quindi i negativi sono completamente accettabili. Per fortuna non c'è bisogno di essere pienamente consapevole di questo, come il codice funziona benissimo:

// 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."); 
} 

ho usato 1888 in modo che tutti i rapporti affermando questo è il minimo sarà più chiaro che il codice è stato eseguito e non ignorato/ignorato. Devo notare che non ho ancora sentito se questo funziona o meno sul dispositivo segnalato.

0

Ciao, ho trovato la soluzione per questo. puoi impostare il valore -ve nel metodo setMinDate() e funziona per me.

dp.setMinDate(-1576800000000L); 
Problemi correlati