2011-12-23 17 views
9

Tenemos un miembro que informa que no puede establecer una fecha anterior al 1 de enero de 1970 en nuestro DatePickerDialog. Este problema no repro para nosotros.DatePickerDialog que impone incorrectamente una fecha mínima del 1 de enero de 1970

Ya soy consciente de que DatePickerDialog no expone las funciones setMinDate/setMaxDate del DatePicker subyacente, por lo que parece que algún tipo de modificación específica del fabricante del teléfono está afectando a minDate/maxDate.

Este usuario informa que está ejecutando un Droid x2 en Verizon con 2.2 Froyo. Si bien creemos que tiene razón en la descripción del modelo de su dispositivo, muchos usuarios están confundidos acerca de la versión del sistema operativo, por lo que puede estar ejecutando 2.3.

I intentado resolver este problema mediante la adición de este tema a mi Actividad:

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

Si bien este tema en mi actividad tuvo el efecto deseado de limitar la DatePickerDialog en mis dispositivos de prueba (una ficha Galaxy y un original Motorola Droid), aparentemente no tuvo ningún efecto para el usuario.

Este número repros para nuestro usuario el 100% del tiempo, pero funciona correctamente para nosotros en nuestros propios dispositivos.

¿Alguien puede explicar qué podría estar causando esto y cómo podríamos solucionarlo?

Tengo filed this bug against Google sobre este asunto.

Gracias!

+0

Algunos de nuestros usuarios (incluido un usuario de Droid x2) informaron sobre el mismo problema, y ​​tampoco hemos podido reproducirlo en nuestra empresa. – greg7gkb

+0

También repros en Motorola Razr – HannahMitt

+0

¿Alguien tiene actualizaciones sobre esto? Todavía recibimos informes de esto en el campo ... no hay acceso a un Razr desafortunadamente :( – greg7gkb

Respuesta

2

La fecha de inicio de los dispositivos Android comienza el 1 de enero de 1970. Tal vez este sea su caso. Android calcula el tiempo transcurridos varios milisegundos desde el 1 de enero de 1970.

He encontrado una especie de truco para su caso. Aquí crear dinámicamente selector de fechas:

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

En el archivo de manifiesto que declara un tema personalizado para mi aplicación - Quiero el mismo tema de la aplicación. Por cierto, puedes hacer lo mismo para la actividad.

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

En un styles.xml hago esto:

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

La fecha de inicio predeterminada en mi caso es 1900. Por lo tanto, para mí este enfoque funciona.

Espero que esto te ayude!

+3

Sólo como referencia, esto es lo que se llama "Unix Epoch" o "Tiempo de Unix", y esta es solo una de las razones por las que trato de evitar usarlo tanto como sea posible. Más sobre el tema aquí: http: //en.wikipedia .org/wiki/Unix_time –

+0

Si bien, unixtime es con frecuencia el método de representación temporal en dispositivos, especialmente para fechas "actuales" (como tiempos de modificación de archivos), ese no es el caso para un DatePicker, que tiene su propia representación interna, según esta fuente aquí: http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/widget/DatePicker.java#DatePicker – esilver

+0

Nosotros He ido con esta solución por ahora, veré cómo responde el mercado :) – greg7gkb

0

Veo que ya intentó hacer algo similar, pero que han intentado establecer lo siguiente:

android:startYear="1900" 

directamente en la DatePicker XML?

así:

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

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

+0

No tenemos ningún XML DatePicker. DatePickerDialog está construido dinámicamente. El DatePicker se asigna por DatePickerDialog según esta fuente aquí: 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

Parece que no puedo encontrar en los documentos una forma de establecer programáticamente el parámetro 'startDate', lo siento ... –

+0

Por estas líneas en la fuente DatePicker: private static final int DEFAULT_START_YEAR = 1900; No debería tener que configurarlo programáticamente, y el hecho de que el Droid x2 fue capaz de hacerlo indica que hay un error en algún lugar .... – esilver

0

realizo esta pregunta es un poco viejo, y que esta respuesta no se aplicará a los dispositivos más antiguos, pero he estado recientemente hizo consciente de este problema en un dispositivo más nuevo (el Huawei Mediapad 7 Youth), así que pensé en actualizar esto con información más reciente:

Comenzando con API 11, se exponen los métodos necesarios para hacer esto. Recuerde, mientras que Calendar puede usar Unix Epoch como cero, Java (al menos hasta ~ JRE 8?) Usa números con signo, por lo que los negativos son completamente aceptables. Afortunadamente, usted no tiene que ser plenamente consciente de esto, ya que este código funciona muy bien:

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

Solía ​​1888 de manera que cualquier informe que indica esto es el mínimo hará que sea más claro que el código se ejecuta y no se hizo caso omiso/anulado Debo señalar que todavía no escuché si esto funciona en el dispositivo reportado.

0

Hola, he encontrado la solución para ello. puedes establecer el valor -ve en el método setMinDate() y funciona para mí.

dp.setMinDate(-1576800000000L); 
Cuestiones relacionadas