Los cuadros de diálogo de Android 4.1.2 se llaman dos veces

Tengo este problema con mi aplicación cuando llamo para mostrar un diálogo, se está llamando dos veces de alguna manera. Esto sólo ocurre con android 4.1 y superior. Versión inferior funciona bien, así que no creo que sea un problema de código.

¿Has oído que \ encontró este problema antes?

Aquí el código:

Button edit = (Button) ad.findViewById(R.id.editBtn); edit.setTypeface(roboto); edit.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { setDate(); ad.dismiss(); } }); ad.show(); ad.setOnDismissListener(new OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { shiftsActivity.setPressed(true); } }); } public void setDate() { // Initialize and open the set date dialog DatePickerDialog setDateDialog = new DatePickerDialog(Shifts.this, datePickerListener, dateAndTime.get(Calendar.YEAR), dateAndTime.get(Calendar.MONTH), dateAndTime.get(Calendar.DAY_OF_MONTH)); setDateDialog.setTitle("Set Date"); setDateDialog.show(); } public void setStartTime() { TimePickerDialog setStartTimeDialog = new TimePickerDialog(Shifts.this, startTimePicker, dateAndTime.get(Calendar.HOUR), dateAndTime.get(Calendar.MINUTE), true); setStartTimeDialog.setTitle("Started At:"); setStartTimeDialog.show(); } public void setEndTime() { TimePickerDialog setEndTimeDialog = new TimePickerDialog(Shifts.this, setEndTime, dateAndTime.get(Calendar.HOUR), dateAndTime.get(Calendar.MINUTE), true); setEndTimeDialog.setTitle("Ended:"); setEndTimeDialog.show(); } TimePickerDialog.OnTimeSetListener startTimePicker = new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { startIntHours = hourOfDay; startIntMinutes = minute; editStartTime = String.format("%02d", hourOfDay) + ":" + String.format("%02d", minute); setEndTime(); } }; TimePickerDialog.OnTimeSetListener setEndTime = new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { finishIntHours = hourOfDay; finsihIntMinutes = minute; if (finishIntHours < startIntHours) { finishIntHours = finishIntHours + Utility.HOURS_TIME_UNIT; } if (finsihIntMinutes < startIntMinutes) { finsihIntMinutes = finsihIntMinutes + Utility.MINUTES_TIME_UNIT; } totalHours = finishIntHours - startIntHours; totalMinutes = finsihIntMinutes - startIntMinutes; Log.i("TotalHours in time picker", "" + totalHours); Log.i("Totalminute in time picker", "" + totalMinutes); editEndTime = String.format("%02d", hourOfDay) + ":" + String.format("%02d", minute); replace(Shifts.view, Shifts.position); } }; 

De acuerdo con su código, ninguno de esos métodos se llaman nunca, porque nunca utiliza el TimePickerDialogs .

Dicho esto, existe un problema conocido relacionado con el comportamiento de DatePickerDialog / TimePickerDialog que puede ser relevante: http://code.google.com/p/android/issues/detail?id=34833

Aquí está una solución básica, para alguien que necesita un TimeChooserDialog, que no llama al oyente dos veces, con opciones básicas

 public static AlertDialog getTimePickerDialog(Context context, final OnTimeSetListener listener, int hour, int minute, boolean is24HFormat) { AlertDialog.Builder builder = new AlertDialog.Builder(context); final TimePicker timePicker = new TimePicker(context); timePicker.setIs24HourView(is24HFormat); timePicker.setCurrentHour(hour); timePicker.setCurrentMinute(minute); builder.setView(timePicker); builder.setPositiveButton(android.R.string.ok, new OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { if(null != listener) { listener.onTimeSet(timePicker, timePicker.getCurrentHour(), timePicker.getCurrentMinute()); } } }); builder.setNegativeButton(android.R.string.cancel, null); return builder.create(); } 

Si miras en la fuente androide, aparece que onTimeSet () se llama durante onStop (). El cuadro de diálogo también llama a onTimeSet () en su método onClick ().

Para superar esto tuve que anular los diálogos descartar y cancelar funciones para establecer un booleano que he comprobado si el onTimeSet se estaba llamando desde el botón de clic o descartar / cancelar

Lo intento y es trabajo bueno conmigo si usted todavía tiene el problema intente utilizar El classic singleton

Algo como esto 🙂 lea más al respecto.

 public void setStartTime() { TimePickerDialog setStartTimeDialog = NULL; if(setStartTimeDialog == null) { new TimePickerDialog(Shifts.this, startTimePicker, dateAndTime.get(Calendar.HOUR),dateAndTime.get(Calendar.MINUTE), true); setStartTimeDialog.setTitle("Started At:"); } setStartTimeDialog.show(); } 

No utilice el TimePickerDialog incorporado o DatePickerDialog. En su lugar, cree un diálogo personalizado como lo que se muestra aquí. Es simple y fácil de usar y sólo funciona!

  AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); final TimePicker timePicker = new TimePicker(getActivity()); builder.setTitle("Set Time"); builder.setView(timePicker); builder.setNegativeButton("Cancel", new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } }); builder.setPositiveButton("OK"), new OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { int minute = timePicker.getCurrentMinute(); int hourOfDay = timePicker.getCurrentHour(); } }); builder.show(); 

El mismo problema se produce conmigo para TimePicker. Resuelvo ese problema.

 new TimePickerDialog.OnTimeSetListener() { @Override public void onTimeSet(TimePicker view, int setHour, int setMinute) { if (view.isShown()) { // This method will return true only once } } }; 

IShown ():

Devuelve la visibilidad de esta vista y de todos sus antepasados

Devuelve True si esta vista y todos sus antepasados ​​son VISIBLES

En lugar de violar super.onClose () o hacer diálogos personalizados, lo soluciono con el envoltorio de oyente real y extendiendo TimePickerDialog que habilitó y deshabilita el reenvío desde el contenedor al oyente real. No es una gota en reemplazo, pero es bastante aseado.

 public class TimePickerDialogCustom extends TimePickerDialog { protected TimePickerDialogOnTimeSetListenerWrapper listenerWrapper; public TimePickerDialogCustom(Context context, TimePickerDialogOnTimeSetListenerWrapper listener, int hourOfDay, int minute, boolean is24HourView) { super(context, listener, hourOfDay, minute, is24HourView); listenerWrapper = listener; } @Override protected void onStop() { if (listenerWrapper != null) listenerWrapper.enabled = false; super.onStop(); if (listenerWrapper != null) listenerWrapper.enabled = true; } public static final class TimePickerDialogOnTimeSetListenerWrapper implements TimePickerDialog.OnTimeSetListener { private boolean enabled = true; private final TimePickerDialog.OnTimeSetListener delegate; public TimePickerDialogOnTimeSetListenerWrapper(TimePickerDialog.OnTimeSetListener delegate) { this.delegate = delegate; } @Override public void onTimeSet(TimePicker view, int hourOfDay, int minute) { if (enabled) { this.delegate.onTimeSet(view, hourOfDay, minute); } } } } 

Luego para usarlo:

  TimePickerDialogCustom.TimePickerDialogOnTimeSetListenerWrapper listenerWrapper = new TimePickerDialogCustom.TimePickerDialogOnTimeSetListenerWrapper(realListener); // Create a new instance of DatePickerDialog and return it TimePickerDialogCustom dialog = new TimePickerDialogCustom( getActivity(), listenerWrapper, hourOfDay, minute, DateFormat.is24HourFormat(getActivity())); 

Me enfrenté a este problema mostrando el timepicker dos veces. He sobrepasado el onStop () de TimePickerDialog y que resolvió el problema. También no debe llamar a super.onStop () en su overriden onStop ().

 @Override public void onStop() { //super.onStop(); Log.d(TAG, "onStop of starttime TimePickerDialog."); } 
  • ¿Cómo actualizar los valores de setMultiChoiceItems en onPrepareDialog?
  • Android hace que el cuadro de diálogo esté completo con la barra de estado mostrando
  • Problema con el cuadro de diálogo de alerta personalizada
  • La interfaz se está desvaneciendo pero el cuadro de diálogo de alerta no se muestra
  • Diálogo Android, mantener el cuadro de diálogo abierto cuando se pulsa el botón
  • ¿Cómo consumir y descartar el PopupWindow cuando se hace clic fuera?
  • ShowDialog obsoleta. ¿Cuál es la alternativa?
  • Diálogo de alerta en android no debe descartar
  • ¿Cómo establecer la posición del diálogo?
  • Ancla el cuadro de diálogo Android a una vista
  • Cuadro de diálogo con EditText y Spinner
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.