¿Cómo deshabilitar las fechas pasadas en el selector de fechas de Android?

82

¿Cómo puedo desactivar las fechas pasadas en mi selector de fechas de Android?

Aquí está el código que produce mi DatePicker:

@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(" "));
    }
};
Addy
fuente
2
DatePickerDialog datePickerDialog = new DatePickerDialog (getActivity (), fecha, myCalendar.get (Calendar.YEAR), myCalendar.get (Calendar.MONTH), myCalendar.get (Calendar.DAY_OF_MONTH)); datePickerDialog.getDatePicker (). setMinDate (System.currentTimeMillis () - 1000); datePickerDialog.show ();
Dilip

Respuestas:

221

Tu puedes hacer

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

que establece la fecha de hoy como fecha mínima y todas las fechas pasadas están deshabilitadas.

datePickeres un objeto de DatePickersi está utilizando un objeto de DatePickerDialogpuede hacer

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

Nota: setMinDatese introdujo en API 11

Apoorv
fuente
Gracias por la respuesta .. ¿Dónde debo poner esta línea?
Addy
1
Gracias por la respuesta. Pero cuando utilicé la solución anterior, se bloqueó mi aplicación. Así que cambié "System.currentTimeMillis () - 1000" a "System.currentTimeMillis () - 10000" y mi aplicación funcionó perfectamente. ¿Puede por favor, déjeme saber por qué me falla restando 1000 pero no 10000?
user3705697
3
las fechas anteriores están deshabilitadas pero se pueden seleccionar :(
Sjd
1
este también funciona bien para mí datePickerDialog.getDatePicker (). setMinDate (System.currentTimeMillis ()) entonces, ¿cuál es la diferencia entre setMinDate (System.currentTimeMillis ()) y setMinDate (System.currentTimeMillis () - 1000)
RAJESH KUMAR ARUMUGAM
2
¿Puedo saber la razón de tener -1000?
Cheok Yan Cheng
15

Este método funcionará correctamente.

//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();
Arvin Jayanake
fuente
8

Así es como lo hago:

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

Así es como crea una instancia del selector:

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

Esta es mi implementación, siéntete libre de cambiarla. Tenga en cuenta que este código establece mindate como fecha de currnet de forma predeterminada. También la newInstance es importante.

Argumento ilegal
fuente
4

Con la biblioteca de componentes de materiales, simplemente use MaterialDatePickery construya la suya propia DateValidatoro puede usar la DateValidatorPointForwardprovista por la biblioteca.

Algo como:

MaterialDatePicker.Builder<Long> builder = MaterialDatePicker.Builder.datePicker();

CalendarConstraints.DateValidator dateValidator = DateValidatorPointForward.now();
//if you need a custom date just use
//CalendarConstraints.DateValidator dateValidator = DateValidatorPointForward.from(yourDate);
constraintsBuilder.setValidator(dateValidator);
builder.setCalendarConstraints(constraintsBuilder.build());

MaterialDatePicker<Long> picker = builder.build();
picker.show(getSupportFragmentManager(), picker.toString());

ingrese la descripción de la imagen aquí

Gabriele Mariotti
fuente
Me gusta el enfoque "aquí hay un código, averígualo" que material.io tomó para documentar esto. github.com/material-components/material-components-android/blob/…
lasec0203
3

Puedes usar esta línea en tu código ...

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);
    }
};
Sikander Bhutto
fuente
¿Y para qué calendar.add(Calendar.DATE, 0);y para Calendar calendarsí mismo si no se usa? Fecha newDate = nueva fecha (); es suficiente.
CoolMind
3

Salida

Calendar c = Calendar.getInstance();
DatePickerDialog dialog = new DatePickerDialog(context, new DatePickerDialog.OnDateSetListener() {
    @Override
    public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
        String _year = String.valueOf(year);
        String _month = (month+1) < 10 ? "0" + (month+1) : String.valueOf(month+1);
        String _date = dayOfMonth < 10 ? "0" + dayOfMonth : String.valueOf(dayOfMonth);
        String _pickedDate = year + "-" + _month + "-" + _date;
        Log.e("PickedDate: ", "Date: " + _pickedDate); //2019-02-12
    }
}, c.get(Calendar.YEAR), c.get(Calendar.MONTH), c.get(Calendar.MONTH));
dialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);
dialog.show();
Ketan Ramani
fuente
2

Ok, estoy usando MaterialDatePicker Library y es demasiado simple establecer una fecha mínima en él.

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);
Pradeep Kumar Kushwaha
fuente
2

Puede usar la función DatePicker # setMinDate () para establecer una fecha mínima.

 datePickerDialog.getDatePicker().setMinDate(calendar.getTimeInMillis());
Karan Chunara
fuente
1

Tuve el mismo problema. Así es como lo resolví.

Paso 1: declare el oyente de clics para abrir el selector de fecha.

dateTime.setOnClickListener(new View.OnClickListener() {
     @Override
     public void onClick(View v) {
         showDateTimePicker();
     }
 });

Paso 2: declare un oyente que esté atento al cambio de fecha.

    public void showDateTimePicker(){
     final Calendar currentDate = Calendar.getInstance();
     date = Calendar.getInstance();
     DatePickerDialog.OnDateSetListener dateSetListener = new 
     DatePickerDialog.OnDateSetListener() {
     @Override
     public void onDateSet(DatePicker datePicker, int year, int 
     monthOfYear, int dayOfMonth) {
     date.set(year, monthOfYear, dayOfMonth);
    //use this date as per your requirement
     }
 };
}

Paso 3: Ahora también debemos declarar un cuadro de diálogo selector de fecha dentro del método showDateTimePicker () anterior. También limitaremos el acceso a fechas pasadas en este paso.

          public void showDateTimePicker(){
             final Calendar currentDate = Calendar.getInstance();
             date = Calendar.getInstance();

            DatePickerDialog.OnDateSetListener dateSetListener = new 
            DatePickerDialog.OnDateSetListener() {
             @Override
             public void onDateSet(DatePicker datePicker, int year, int 
             monthOfYear, int dayOfMonth) {
             date.set(year, monthOfYear, dayOfMonth);

            //use this date as per your requirement
             }
         };
          DatePickerDialog datePickerDialog = new  
          DatePickerDialog(**Your Activity Name.this**, dateSetListener, 
          currentDate.get(Calendar.YEAR), 
          currentDate.get(Calendar.MONTH),   
          currentDate.get(Calendar.DAY_OF_MONTH));
        // Limiting access to past dates in the step below:
 datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);
         datePickerDialog.show();
        }

Esto es todo lo que necesitas hacer. Aquí está el código final que puede querer mirar:

    private Date date;

dateTime.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
             showDateTimePicker();
         }
     });



public void showDateTimePicker(){
 final Calendar currentDate = Calendar.getInstance();
date = Calendar.getInstance();

 DatePickerDialog.OnDateSetListener dateSetListener = new DatePickerDialog.OnDateSetListener() {
     @Override
     public void onDateSet(DatePicker datePicker, int year, int monthOfYear, int dayOfMonth) {
         date.set(year, monthOfYear, dayOfMonth);

    //use this date as per your requirement
     }
 };
 DatePickerDialog datePickerDialog = new  DatePickerDialog(**Your Activity Name.this**, dateSetListener, currentDate.get(Calendar.YEAR), currentDate.get(Calendar.MONTH),   currentDate.get(Calendar.DAY_OF_MONTH));
 datePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);
 datePickerDialog.show();
}

Espero que ayude a alguien.

asm1609
fuente
Si bien este código puede responder a la pregunta, proporcionar un contexto adicional sobre por qué y / o cómo este código responde a la pregunta mejora su valor a largo plazo.
Vishal Chhodwani
@VishalChhodwani Gracias por la entrada. He hecho algunas modificaciones. :)
asm1609
1

Esto depende de lo que desee deshabilitar si desea establecer una fecha mínima de hasta un par de días, entonces el mejor enfoque es usar LocalDateTime así:

        val ldt: LocalDateTime = LocalDateTime.now().minusDays(30)
        val zone: ZoneId = ZoneId.of("Europe/Berlin")

        val zoneOffSet: ZoneOffset = zone.rules.getOffset(ldt)
        dpd.datePicker.minDate = ldt.toInstant(zoneOffSet).toEpochMilli()
        dpd.datePicker.maxDate = System.currentTimeMillis()
        dpd.show()

Establece la nueva fecha y hora local en menos de 30 días a partir de ahora y después de eso, establece en qué zona horaria debe estar para mi ejemplo. Estoy usando la hora "Europa / Berlín", la adjunta a dpd. datePicker.minDate = ldt.toInstant (zoneOffSet) .toEpochMilli () establecido en epochMilli y eso es todo

Martin Gelevski
fuente
Muy buena respuesta. Gracias
ashishdhiman2007
1

Kotlin

Directamente al selector de fecha:

datePicker.minDate = System.currentTimeMillis()

Si está utilizando un objeto de DatePickerDialog:

datePickerDialog.datePicker.minDate = System.currentTimeMillis()
Ben
fuente