2014-05-20 19 views
34

Come disabilitare le date passate nel selettore di date Android?Come disabilitare le date passate nel selettore di date Android?

@Override 
protected Dialog onCreateDialog(int id) { 
    switch (id) { 
    case DATE_DIALOG_ID: 
     // set date picker as current date 
     return new DatePickerDialog(this, datePickerListener, year, month, 
       day); 
    } 
    return null; 
} 

private DatePickerDialog.OnDateSetListener datePickerListener = new DatePickerDialog.OnDateSetListener() { 
    public void onDateSet(DatePicker view, int selectedYear, 
      int selectedMonth, int selectedDay) { 
     year = selectedYear; 
     month = selectedMonth+1; 
     day = selectedDay; 

     startdate.setText(new StringBuilder().append(day).append("-") 
       .append(getMonth(month + 1)).append("-").append(year) 
       .append(" ")); 
    } 
}; 
+0

DatePickerDialog datePickerDialog = new DatePickerDialog (getActivity(), data, myCalendar.get (Calendar.YEAR), myCalendar.get (Calendar.MONTH), myCalendar.get (Calendar.DAY_OF_MONTH)); datePickerDialog.getDatePicker(). SetMinDate (System.currentTimeMillis() - 1000); datePickerDialog.show(); – Dilip

risposta

121

Si può fare

datePicker.setMinDate(System.currentTimeMillis() - 1000); 

che fissa la data odierna come data minima e sono disabilitate tutte le date passate.

datePicker è un oggetto di DatePicker se si utilizza un oggetto di DatePickerDialog si può fare

datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000); 

Nota: setMinDate è stato introdotto nel API 11

+0

Grazie per la risposta .. Dove dovrei mettere questa linea? – Addy

+0

Dove si crea l'oggetto 'DatePicker' o' DatePickerDialog' – Apoorv

+1

Grazie per la risposta. Ma quando ho usato la soluzione di cui sopra mi ha dato crash nella mia applicazione. Così ho cambiato "System.currentTimeMillis() - 1000" in "System.currentTimeMillis() - 10000" e la mia applicazione ha funzionato perfettamente. Per favore potresti sapere perché sto andando in crash sottrarre 1000 ma non su 10000 – user3705697

6

Questo è come lo faccio:

public class DatePickerFragment extends DialogFragment { 
OnDateSetListener ondateSet; 
Calendar c; 
int year = 0, month = 0, day = 0; 

public DatePickerFragment() { 
} 

public void setCallBack(OnDateSetListener ondate) { 
    ondateSet = ondate; 
} 

public static DatePickerFragment newInstance(Bundle bundle) { 
    DatePickerFragment myFragment = new DatePickerFragment(); 
    myFragment.setArguments(bundle); 
    return myFragment; 
} 

@Override 
public Dialog onCreateDialog(Bundle savedInstanceState) { 
    // final Calendar c = Calendar.getInstance(); 
//if else for null arguments 
    if (getArguments() != null) { 
     year = getArguments().getInt("year"); 
     month = getArguments().getInt("month"); 
     day = getArguments().getInt("day"); 
     c = Calendar.getInstance(); 
     c.set(year, month, day); 

    } else { 
     c = Calendar.getInstance(); 
     year = c.get(Calendar.YEAR); 
     month = c.get(Calendar.MONTH); 
     day = c.get(Calendar.DAY_OF_MONTH); 
     Log.d("else", "else"); 
    } 


    DatePickerDialog picker = new DatePickerDialog(getActivity(), 
      ondateSet, year, month, day); 
    picker.getDatePicker().setMinDate(c.getTime().getTime()); 
    Log.d("picker timestamp", c.getTime().getTime() + ""); 
    return picker; 
} 
} 

Ecco come si instanzia il raccoglitore:

Bundle bundle = new Bundle(); 
     Calendar c = Calendar.getInstance(); 
     bundle.putInt("year", c.get(Calendar.YEAR)); 
     bundle.putInt("month", c.get(Calendar.MONTH)); 
     bundle.putInt("day", c.get(Calendar.DAY_OF_MONTH)); 
     DatePickerFragment fragment = DatePickerFragment 
       .newInstance(bundle); 
     fragment.setCallBack(dateSet); 
     fragment.show(getActivity().getSupportFragmentManager(), null); 

Questa è la mia implementazione sentitevi liberi di cambiarlo. Si noti che questo codice imposta mindate come data currnet per impostazione predefinita. Anche la nuova sostanza è importante.

+1

Quello che ho cercato .. Grazie. –

11

Questo metodo funzionerà correttamente.

//Get yesterday's date 
Calendar calendar = Calendar.getInstance(); 
calendar.add(Calendar.DATE, -1); 

//Set yesterday time milliseconds as date pickers minimum date 
DatePickerDialog datePickerDialog = new DatePickerDialog(context, myDateListener, year, month, day); 
datePickerDialog.getDatePicker().setMinDate(calendar.getTimeInMillis()); 
datePickerDialog.show(); 
1

È possibile utilizzare questa riga nel codice ...

private Calendar cal; 
private int day; 
private int month; 
private int year; 

static final int DATE_PICKER_ID = 1111; 
TextView textView; 

    textView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      cal = Calendar.getInstance(); 
      day = cal.get(Calendar.DAY_OF_MONTH); 
      month = cal.get(Calendar.MONTH); 
      year = cal.get(Calendar.YEAR); 
      showDialog(DATE_PICKER_ID); 

     } 
    }); 

@Override 
protected Dialog onCreateDialog(int id) { 
    switch (id) { 
     case DATE_PICKER_ID: 
      // create a new DatePickerDialog with values you want to show 

      DatePickerDialog datePickerDialog = new DatePickerDialog(this, datePickerListener, year, month, day); 
      Calendar calendar = Calendar.getInstance(); 

      calendar.add(Calendar.DATE, 0); // Add 0 days to Calendar 
      Date newDate = calendar.getTime(); 
      datePickerDialog.getDatePicker().setMinDate(newDate.getTime()-(newDate.getTime()%(24*60*60*1000))); 
      return datePickerDialog; 
    } 
    return null; 
} 

private DatePickerDialog.OnDateSetListener datePickerListener = new DatePickerDialog.OnDateSetListener() { 
    // the callback received when the user "sets" the Date in the 
    // DatePickerDialog 
    public void onDateSet(DatePicker view, int selectedYear, int selectedMonth, int selectedDay) { 

     textViewTime.setText(selectedDay + "/" + (selectedMonth + 1) + "/" + selectedYear); 
    } 
}; 
+0

E per 'calendar.add (Calendario .DATE, 0); 'e un' Calendar calendar' stesso se non viene utilizzato? Date newDate = new Date(); è sufficiente. – CoolMind

0

Ok, quindi sto usando MaterialDatePicker Biblioteca e il suo troppo semplice per impostare data minima su di esso.

DatePickerDialog mDatePickerDialog = DatePickerDialog.newInstance(listener, 
       mTime.year, mTime.month, mTime.monthDay); 
mDatePickerDialog.setYearRange(2016, 2036); 
Calendar c = Calendar.getInstance(); 
c.setTimeInMillis(System.currentTimeMillis() - 1000); 
mDatePickerDialog.setMinDate(c); 
Problemi correlati