Диалоги Android 4.1.2 называются дважды

У меня есть эта проблема с моим приложением, когда я звоню, чтобы показать диалог, его дважды вызывали. Это происходит только с Android 4.1 и выше. Более низкая версия работает нормально, поэтому я не думаю, что это проблема с кодом.

Вы слышали, что столкнулись с этой проблемой раньше?

Здесь код:

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

Solutions Collecting From Web of "Диалоги Android 4.1.2 называются дважды"

Согласно вашему коду, ни один из этих методов никогда не TimePickerDialogs , потому что вы никогда не используете TimePickerDialogs .

При этом существует известная проблема, связанная с поведением DatePickerDialog / TimePickerDialog которое может иметь значение: http://code.google.com/p/android/issues/detail?id=34833

Вот базовое решение для тех, кому нужен TimeChooserDialog, который не вызывает прослушиватель дважды, с базовыми параметрами

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

Если вы посмотрите в источнике Android, то появится, что onTimeSet () вызывается во время onStop (). Диалог также вызывает методTimeSet () в методе onClick ().

Чтобы обойти это, мне пришлось переопределить диалоги увольнения и отменить функции, чтобы установить логическое значение, которое я проверил при вызове onTimeSet с помощью кнопки щелчка или увольнения / отмены

Я стараюсь, и это хорошо работает со мной, если у вас все еще есть проблема, попробуйте использовать classic singleton

Что-то вроде этого 🙂 Узнайте больше об этом.

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

Не используйте встроенный TimePickerDialog или DatePickerDialog. Вместо этого создайте настраиваемый диалог, как показано здесь. Он прост и прост в использовании и просто работает!

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

Такая же проблема возникает со мной для TimePicker. Я решаю этот вопрос.

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

IShown ():

Возвращает видимость этого представления и всех его предков

Возвращает True, если это представление и все его предки ВИДИМО

Вместо того, чтобы нарушать super.onClose () или создавать настраиваемые диалоги, я решаю его, обертывая реальный слушатель и расширяя TimePickerDialog, который включает и отключает пересылку от обертки к реальному слушателю. Это не капля в замене, но она достаточно аккуратная.

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

Затем, чтобы использовать его:

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

Я столкнулся с этой проблемой, показывая дважды. Я превысил onStop () TimePickerDialog и решил эту проблему. Также вы не должны называть super.onStop () в своем overriden onStop ().

 @Override public void onStop() { //super.onStop(); Log.d(TAG, "onStop of starttime TimePickerDialog."); }