7

Znalazłem DatePicker (okno dialogowe) bardzo mylące ... Po ustawieniu setMinDate() ... pokazany kalendarz naprawdę "wizualnie wyłącza" przekazane daty (niech będą szare), ale te daty są nadal dostępne do wyboru! Chcę, aby użytkownik tego nie robił. Idealny sposób sprawiłby, że zaliczone daty były nieklikalne/nie można było wybrać. Jeśli nie jest to możliwe, należy przynajmniej złapać to zdarzenie (które jedno? OnDateChanged ?, onSelected? ...) i wznieść toast za wiadomość i wyłączyć przycisk OK, dopóki użytkownik nie wybierze prawidłowej daty.Jak zapobiec wybraniu daty daty w DatePickerDialog (setMinDate nie działa zgodnie z oczekiwaniami)

Niestety, datepicker (dialog) nie ma onChangedListener (w rzeczywistości ma on tylko nie ustawiania dla niego). Jedyne wydarzenie, jakie otrzymuję, to naciśnięcie przycisku OK. Jest za późno.

Oto mój kod

dateTextView = (TextView) view.findViewById(R.id.createOrder_date); 
    dateTextView.setText(R.string.createOrder_time_now); 
    dateTextView.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      final Calendar calendarNow = Calendar.getInstance(); 
      final int yearNow = calendarNow.get(Calendar.YEAR); 
      final int monthNow = calendarNow.get(Calendar.MONTH); 
      final int dayNow = calendarNow.get(Calendar.DAY_OF_MONTH); 

      DatePickerDialog datePickerDialog = new DatePickerDialog(CreateOrderFragment.this.getActivity(), new DatePickerDialog.OnDateSetListener() { 
       @Override 
       public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) { 
        Calendar calendar = Calendar.getInstance(); 
        calendar.set(year, monthOfYear, dayOfMonth); 

        if (calendar.before(calendarNow)) { 
         Toast.makeText(CreateOrderFragment.this.getActivity(), getResources().getString(R.string.createOrder_datePicker_selectFutureDate), Toast.LENGTH_SHORT).show(); 
         view.updateDate(yearNow, monthNow, dayNow); 
         calendar = calendarNow; 
        } 

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); 
        dateTextView.setText(sdf.format(calendar.getTime())); 
       } 
      }, yearNow, monthNow, dayNow); 

      datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000); 
      datePickerDialog.setTitle(getResources().getString(R.string.createOrder_datePicker_title)); 
      datePickerDialog.show(); 

     } 
    }); 

enter image description here

+0

'SimpleDateFormat SDF = nowy SimpleDateFormat ("dd/mm/rok");' \t \t 'Data minDate = NULL;' \t \t 'próby {' \t \t \t 'minDate = sdf.parse (" 01/01/2014"); ' \t \t'} zaczep (ParseException e) { ' \t \t \t' w.printStackTrace(); ' \t \t \t' powrotu; ' \t' \t} ' ::: Zrobiłem to, używając tego. ** UWAGA: ** Dotyczy API poziomu 9 i powyżej –

+0

Czy kiedykolwiek znalazłeś rozwiązanie tego problemu? – jlindenbaum

+0

Niestety nie. – Wooff

Odpowiedz

1

Po otrzymaniu datę w onDateSent(), wystarczy sprawdzić, czy to wcześniej niż w terminie określonym w opcji setMinDate(). Jeśli tak, po prostu pokaż ponownie DatePickerDialog.

Kod:

final long tomorrow = System.currentTimeMillis() + DateUtils.MILLIS_IN_DAY; 

private void showDatePickerDialog() 
{ 
    mDatePickerDialog = new DatePickerDialog(getActivity(), new DatePickerDialog.OnDateSetListener() 
    { 
     @Override 
     public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) 
     { 
      Calendar calendar = Calendar.getInstance(); 
      calendar.set(year, monthOfYear, dayOfMonth); 

      //kv If user tries to select date in past (or today) 
      if (calendar.getTimeInMillis() < tomorrow) 
      { 
       //kv Make them try again 
       showDatePickerDialog(); 

       Toast.makeText(this, "Invalid date, please try again", Toast.LENGTH_LONG).show(); 
      } 
      else 
      { 
       //success 
      } 
     } 
    }, calendarTwoWeeksInFuture.get(Calendar.YEAR), calendarTwoWeeksInFuture.get(Calendar.MONTH), calendarTwoWeeksInFuture.get(Calendar.DAY_OF_MONTH)); 

    //kv Set minimum date as tomorrow 
    mDatePickerDialog.getDatePicker().setMinDate(tomorrow); 

    mDatePickerDialog.show(); 
} 
+0

Niestety nie jest to bardzo przyjazne dla użytkownika. Nie rozwiązuje problemu, który pozwala użytkownikowi wybrać nieprawidłową datę. Rozwiązaniem powinno być to, że nieważna data nie może być możliwa do wyboru. Albo przez UI (nie można wybrać daty), albo natychmiastową akcję (po wybraniu przez użytkownika nieprawidłowej daty - wyświetlany jest komunikat sprawdzania poprawności (toast?) I wybrana jest ostatnia wybrana ważna data). – Wooff

+0

Wiem, że to nie jest rozwiązanie pomysłu, ale działa. Nie pozwala użytkownikowi kontynuować i pokazuje toast, jeśli wybrana data jest nieprawidłowa. –

0

czekałem na chwilę, a wydaje się, że nie da się tego zrobić w nowym datePickerDialog (5+) można obsługiwać przez siebie raczej zwróceniem/wartość max min od kliknięcia lub przez ponowne otwarcie okna dialogowego, aż do dewelopera.