android - studio - OnTimeSet también se llama cuando se descarta TimePickerDialog
manejo de fechas en android studio (5)
Hoy intentaba usar el TimePickerDialog
pero noté un par de fallas.
- También se llama a OnTimeSet cuando se descarta el cuadro de diálogo (haciendo clic afuera, por ejemplo)
- OnTimeSet se llama dos veces cuando el usuario pulsa el botón "Listo"
La API que estoy usando es 18.
¿Alguien más ha experimentado estos problemas? Como los resolviste?
Debes usar el método ya dado de la clase de Vista:
new TimePickerDialog.OnTimeSetListener() {
@Override
public void onTimeSet(TimePicker view, int hour, int minute) {
if (view.isShown()) {
// This method will return true only once...
}
}
};
Enfrenté exactamente el mismo problema hoy. No se pudo averiguar por qué sucedía esto, pero se encontró una solución simple:
El método onTimeSet () se llama una vez cuando se cierra el diálogo y se llama dos veces cuando se hace clic en el botón Hecho. De cualquier manera, hay una llamada no deseada a onTimeSet (). Así que decidí ignorar siempre la primera llamada.
Aquí está el código:
Calendar mcurrentTime = Calendar.getInstance();
int hour = mcurrentTime.get(Calendar.HOUR_OF_DAY);
int minute = mcurrentTime.get(Calendar.MINUTE);
TimePickerDialog mTimePicker;
mTimePicker = new TimePickerDialog(MainActivity.this, new TimePickerDialog.OnTimeSetListener()
{
int callCount = 0; //To track number of calls to onTimeSet()
@Override
public void onTimeSet(TimePicker timePicker, int selectedHour, int selectedMinute)
{
if(callCount == 1) // On second call
{
timeString = selectedHour + ":" + selectedMinute + ":00";
Log.d("TEST", "Chosen time : "+ timeString);
}
callCount++; // Incrementing call count.
}
}, hour, minute, true);
mTimePicker.setTitle("Pick Time");
mTimePicker.show();
Gracias a Tony por publicar una solución. Esto funciona la mayor parte del tiempo pero no siempre. Habíamos lanzado nuestra aplicación con esta solución (junto con las verificaciones de versión); sin embargo, esta solución falló en Samsung Galaxy Note GT-8000 (Android 4.4.2). Los dispositivos 4.4.2 predeterminados tienen este error y la solución funciona, sin embargo, Samsung parece haber solucionado este problema en la versión 4.4.2, por lo que solo se llama a TimeSet () una vez que lo ignoramos y la segunda llamada nunca ocurrió.
Estamos publicando una solución que aplicamos hoy. Aunque no estoy contento con la solución, ya que es otro truco / solución alternativa, puede ayudar en situaciones en las que la comprobación de versiones no ayuda y los fabricantes de equipos originales combinan soluciones selectivas.
Nuestra implementación anterior fue
if((android.os.Build.VERSION.SDK_INT >=
Build.VERSION_CODES.ICE_CREAM_SANDWICH) &&
(android.os.Build.VERSION.SDK_INT <
Build.VERSION_CODES.LOLLIPOP)){
if(ccount == 1){
// Do Your Processing
count = 0;
}else{
// Ignore event. Bug in Android API
count++;
}
}else{
// Do Your Processing
}
Nuestra nueva implementación es
if((android.os.Build.VERSION.SDK_INT >=
Build.VERSION_CODES.ICE_CREAM_SANDWICH) &&
(android.os.Build.VERSION.SDK_INT <
Build.VERSION_CODES.LOLLIPOP)){
StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace();
StackTraceElement e = stacktrace[4];
String methodName = e.getMethodName();
if(methodName.equals("onClick")){
// Do Your Processing
}else{
// Ignore event. Bug in Android API
}
}else{
// Do Your Processing
}
Espero que pueda ayudar a otros.
Para reiterar: este es un error confirmado en Android para varios tipos de diálogo. Ya se han sugerido dos soluciones alternativas, guardar el estado en una variable (instancia) o preguntar al Diálogo si se isShown()
. Pero isShown()
parece ser poco confiable en Android 4.0.4 y guardar el estado se vuelve complicado si desea volver a mostrar el diálogo.
Una mejor solución es guardar el estado dentro del diálogo, ya que es la misma instancia que llama al método:
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.
Usando la cuenta para evitarlo. cuando se seleccionó TimePickDialog más de dos veces, también debería funcionar bien.
TimePickerDialog tpd = new TimePickerDialog(this, new TimePickerDialog.OnTimeSetListener() {
int count = 0;
@Override
public void onTimeSet(TimePicker view, int setHour, int setMinute) {
if(count % 2 == 0) {
//set time here
}
count++;
} }, hour, minute, true);