7

Ich fand DatePicker (Dialog) sehr verwirrend ... Wenn setMinDate() eingestellt ist ... der angezeigte Kalender wirklich "visual disable" vergangene Daten (mache sie grau), aber diese Daten sind immer noch wählbar! Ich möchte Benutzer davon abhalten, dies zu tun. Idealerweise wäre es möglich, vergangene Daten nicht anklickbar/nicht auswählbar zu machen. Wenn es nicht möglich ist, zumindest dieses Ereignis (welches? OnDateChanged ?, onSelected? ...) abzufangen und eine Nachricht zu rösten und die OK-Schaltfläche zu deaktivieren, bis der Benutzer ein gültiges Datum auswählt.So verhindern Sie, dass das übergebene Datum in DatePickerDialog (setMinDate funktioniert nicht wie erwartet)

Bedauerlicherweise hat datepicker (dialog) keinen onChangedListener (eigentlich hat es aber keinen Setter dafür). Das einzige Ereignis, das ich erhalte, ist die OK-Taste. Es ist zu spät.

Hier ist mein Code

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

'Simple sdf = new Simple ("TT/MM/JJJJ");' \t \t 'Datum minDate = null;' \t \t '' try { \t \t \t 'minDate = sdf.parse (" 01/01/2014"); '' \t \t} catch (ParseException e) { ' \t \t \t' e.printStackTrace(); ' \t \t \t' zurückzukehren; '' \t \t} ' ::: Ich habe es damit gemacht. ** HINWEIS: ** Es ist für API Level 9 und höher –

+0

Haben Sie jemals eine Lösung gefunden? – jlindenbaum

+0

leider nicht. – Wooff

Antwort

1

Wenn Sie das Datum in onDateSent() erhalten, nur prüfen, ob es früher ist als das Datum, das Sie in setMinDate gesetzt(). Wenn ja, dann zeige den DatePickerDialog erneut.

Code:

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

Leider ist es nicht sehr benutzerfreundlich. Es löst das Problem nicht, dass der Benutzer ein ungültiges Datum auswählen kann. Die Lösung sollte sein, dass das ungültige Datum nicht ausgewählt werden kann. Entweder über UI (das Datum kann nicht ausgewählt werden) oder sofortige Aktion (nachdem der Benutzer das ungültige Datum ausgewählt hat - die Bestätigungsmeldung wird angezeigt (Toast?) Und das letzte gültige Datum wird ausgewählt). – Wooff

+0

Ich weiß, es ist nicht die Idee Lösung, aber es funktioniert. Der Benutzer kann nicht fortfahren und zeigt einen Toast an, wenn das ausgewählte Datum ungültig ist. –

0

i für eine Weile gesucht haben und es scheint keine Möglichkeit zu geben zu tun, dass in neuen datePickerDialog (5+) Sie es selbst durch eher Zurückführen der Min-/Max-Wert verarbeiten kann Klicken Sie auf oder durch erneutes Öffnen des Dialogfelds, bis zum Entwickler.