¿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(" "));
}
};
Respuestas:
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.
datePicker
es un objeto deDatePicker
si está utilizando un objeto deDatePickerDialog
puede hacerdatePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);
Nota:
setMinDate
se introdujo en API 11fuente
-1000
?Este método funcionará correctamente.
fuente
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.
fuente
Con la biblioteca de componentes de materiales, simplemente use
MaterialDatePicker
y construya la suya propiaDateValidator
o puede usar laDateValidatorPointForward
provista 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());
fuente
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); } };
fuente
calendar.add(Calendar.DATE, 0);
y paraCalendar calendar
sí mismo si no se usa? Fecha newDate = nueva fecha (); es suficiente.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();
fuente
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);
fuente
Puede usar la función DatePicker # setMinDate () para establecer una fecha mínima.
datePickerDialog.getDatePicker().setMinDate(calendar.getTimeInMillis());
fuente
Tuve el mismo problema. Así es como lo resolví.
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 } }; }
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(); }
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.
fuente
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
fuente
Kotlin
Directamente al selector de fecha:
datePicker.minDate = System.currentTimeMillis()
Si está utilizando un objeto de DatePickerDialog:
datePickerDialog.datePicker.minDate = System.currentTimeMillis()
fuente