2012-12-06 12 views
13

Mam ten problem z moją aplikacją, gdy zadzwonię, aby wyświetlić okno dialogowe, jest ono wywoływane dwa razy w jakiś sposób. Dzieje się tak tylko z Androidem 4.1 i nowszym. Niższa wersja działa dobrze, więc nie sądzę, że to jakiś problem z kodem.Okna dialogowe systemu Android 4.1.2 są wywoływane dwukrotnie

Czy słyszałeś \ napotkał ten problem wcześniej?

o kodzie:

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

    } 
}; 
+1

Interesującą częścią jest: gdzie jest 'setStartTime' nazywa – zapl

+0

na 4.0.3 działa normalny – Talha

+0

To prawda, problemy zaczynają się od 4,1 i powyżej. – Yosi199

Odpowiedz

12

Zgodnie z kodem, żadna z tych metod nie jest nigdy wywoływana, ponieważ nigdy nie używasz TimePickerDialogs.

Mając na uwadze powyższe, nie jest to znany problem związany z zachowaniem DatePickerDialog/TimePickerDialog, które mogą być istotne: http://code.google.com/p/android/issues/detail?id=34833

+0

Dziękuję za szybką odpowiedź Mark, dodałem kod, który wywołuje cały przepływ. Po kliknięciu przycisku wywołujesz setDate() i rozpoczyna się przepływ. – Yosi199

+0

@ Yosi199: Jeśli błąd, o którym wspomniałem, nie pomoże, to nie mam dalszych odpowiedzi. Jednak wydaje mi się, że byłoby lepiej dla użytkownika mieć jedną 'DateAndTimeActivity', hostującą' DatePicker' i 'TimePicker', zamiast kłopotać się dwoma osobnymi oknami dialogowymi. – CommonsWare

+0

Mam zamiar przejrzeć błąd, ponieważ istnieje propozycja tymczasowego rozwiązania w podanym przez Ciebie linku. W przeciwnym razie powrócę do mojego kodu i rozważę twoją sugestię. Bardzo dziękuję za poświęcony czas i pomogłeś mi. – Yosi199

0

staram i to jest dobra praca ze mną, jeśli nadal masz problem spróbuj użyć classic singleton

coś takiego :) czytaj więcej na ten temat.

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

} 
+0

Dziękuję za pomoc, ale to mi nie pomogło. Zaktualizowałem kod, więc doceniam, że możesz nadać mu inny wygląd. Dzięki – Yosi199

2

Jeśli spojrzeć na android źródła wynika, że ​​onTimeSet() jest wywoływana podczas OnStop() . Okno dialogowe wywołuje również metodęTimeSet() w jej metodzie onClick().

Aby obejść ten problem miałem zastąpić dialogi odwołać i anulowanie funkcji, aby ustawić wartość logiczną, która sprawdziłem czy onTimeSet była wywoływana z przycisku kliknięcia lub odrzucenie/anulować

+0

dziękuję, to już nie jest istotne, ale wciąż cenię te informacje do przyszłego użytku – Yosi199

3

Tu jest podstawowym rozwiązaniem dla ktoś, kto potrzebuje TimeChooserDialog, że nie wymaga słuchacza dwukrotnie, z podstawowymi opcjami

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

To się nazywa dialog niestandardowy, który zrobiłeś dwa razy. – James

-1

I wobec tego problemu pokazując timepicker dwukrotnie. Przesłoniłem funkcję onStop() programu TimePickerDialog, która rozwiązała problem. Ponadto nie powinieneś wywoływać super.onStop() w overriden onStop().

+0

03-14 15: 18: 47.891: E/AndroidRuntime (29055): android.app.SuperNotCalledException: Fragment DatePickerFragment {425cf2a0} nie zadzwonił do super.onStop() 03-14 15: 18: 47.891: E/AndroidRuntime (29055): \t na Android.app.Fragment.performStop (Fragment.java:1961) 03-14 15: 18: 47.891: E/AndroidRuntime (29055): \t na android.app.FragmentManagerImpl.moveToState (FragmentManager. java: 970) –

0

Nie używaj wbudowanego TimePickerDialog lub DatePickerDialog. Zamiast tego utwórz niestandardowe okno dialogowe, tak jak pokazano tutaj. Jest prosty i łatwy w użyciu i po prostu działa!

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

Ten sam problem występuje u mnie w TimePicker. Rozwiązuję ten problem.

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

iShown():

Zwraca widoczność tego widoku i wszystkich jego przodków

Zwraca Prawda jeśli ten pogląd i wszyscy jego przodkowie są widoczne

0

Zamiast naruszać super.onClose() lub tworzenie niestandardowych okien dialogowych, rozwiązuję go przez zawijanie prawdziwego detektora i wydłużanie TimePickerDialog, który włącza i wyłącza przekazywanie z opakowania do prawdziwego detektora. To nie jest kropla wymiany, ale jest wystarczająco fajna.

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

Potem go używać:

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())); 
Powiązane problemy