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?
- Cambiar el contenido de un cuadro de diálogo de Android después de la creación
- ¿Cómo agregar el título al cuadro de diálogo personalizado?
- Cómo quitar el título en el cuadro de diálogo?
- Fuerza de diálogo personalizada de Android cierre
- Callback cuando se desactiva DialogFragment
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); } };
- Cómo deshabilitar el botón de retroceso cuando el cuadro de alerta está en la pantalla
- SupportMapFragment en DialogFragment
- Cómo obtener datos de un cuadro de diálogo personalizado
- ¿Cómo hacer transparente un diálogo personalizado?
- ¿Cómo hacer que un diálogo de alerta llene el 90% del tamaño de la pantalla?
- Android Prevent Bluetooth Dialing Dialog
- Android no puede obtener el tamaño de archivo de diálogo
- Android desactivar el botón positivo en algunos condion en addTextChangedListener (editext)
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."); }
- Gestionar todos los eventos de mouse en Android
- Sqlite plugin para Eclipse: depurar la base de datos sqlite en el dispositivo Android en vivo