2012-07-08 8 views
18

Mi aplicación funcionaba perfectamente en mi emulador Android 2.2. Luego decidí probar con un emulador de Android 4.1. El DatePickerDialog se ve un poco diferente y por alguna razón cuando presiono "Listo", el oyente onDateSet() recibe dos llamadas y causa problemas en mi aplicación.Android: Emulador Android 4.1 que invoca onDateSet dos veces desde el Diálogo DatePicker

Lo sé porque el registro se muestra a continuación en el código se imprime dos veces cada vez que hago clic en "Hecho"

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

mismo problema android 4.1 en emulador 30 de agosto de 2012, vote aquí https://code.google.com/p/android/issues/detail?id=34860 ​​ – Moak

+0

posible duplicado de [Jelly Bean DatePickerDialog --- ¿hay una forma de cancelar?] (http: // stackoverflow.com/questions/11444238/jelly-bean-datepickerdialog-is-there-a-way-to-cancel) –

Respuesta

24

Intente establecer un valor booleano para comprobar si se produce un doble incendio dentro del mismo cuadro de diálogo. Algo similar a:

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(); 

Este número doble de incendios también sucede con onTimeSet de un TimePickerDialog y esta comprobación también trabaja para ellos.

+0

Sí, eso debería funcionar. Espero que solucionen este problema pronto. –

+1

Mueva la variable 'fired' a' false' para que el DatePicker continúe funcionando después. Por cierto, el problema también ocurre en los cuadros de diálogo TimePicker. –

+0

Este concepto de solución alternativa también funciona para los cuadros de diálogo de TimePicker utilizando un cheque "disparado" similar al momento de la creación. – lodlock

0

Creo que esto está relacionado, comencé a probar en 4.1 hoy y he encontrado que algunos eventos de javascript parecen disparar dos veces. En su mayoría haga clic en este momento. Extrañamente, si agrego una alerta, 'a veces' se dispara una vez. El comportamiento es extrañamente inconsistente.

Los eventos javascript solo responden de esta manera en Android 4.1. iPhone parece estar bien, al igual que todas las versiones anteriores de Android que he probado hasta ahora (incluyendo 4.0.x).

Parece un error con el navegador o la manera en que maneja javascript para mí, pero eso es solo una suposición.

+0

¿Hay alguna sugerencia de cómo resolver este error? ¿Alguna solución alternativa? :) –

+0

Nada que he encontrado hasta ahora. Además de lo anterior, solo parece estar en eventos de clic o toque. no todos los eventos (cuando tenga algo de tiempo) crearé un informe de errores en la lista de errores de Android. – Dan

1

Según Ankur de Chaudhary brillante answer en el problema similar TimePickerDialog, si nos registramos en el interior onDateSet si la vista dada isShown() o no, se va a resolver todo el problema con el mínimo esfuerzo, sin necesidad de extender el selector o la comprobación de algunas banderas horribles que circundan el código o incluso de cheques para la versión del sistema operativo, simplemente hacer lo siguiente:

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

y por supuesto el mismo se puede hacer para onTimeSet según la respuesta de Ankur

0

para reiterar: Thi s es un error confirmado en Android. Ya se han sugerido dos soluciones, guardando el estado en una variable (instancia) o preguntando al cuadro de diálogo si es isShown(). Pero isShown() parece no ser confiable (según this answer's comments por ejemplo) y guardar el estado se vuelve complicado si desea volver a mostrar el cuadro de diálogo.
Una solución mejor es guardar el estado interior del propio diálogo:

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

Es limpio y eficaz.

Cuestiones relacionadas