Как отключить прошлые даты в средстве выбора даты Android?
Вот код, который создает мой 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(" "));
}
};
Ответы:
Ты можешь сделать
datePicker.setMinDate(System.currentTimeMillis() - 1000);
который устанавливает сегодняшнюю дату как минимальную дату, а все прошлые даты отключены.
datePicker
является объектом,DatePicker
если вы используете объект, которыйDatePickerDialog
вы можете сделатьdatePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);
Примечание:
setMinDate
было введено в API 11источник
-1000
?Этот метод будет работать правильно.
источник
Вот как я это делаю:
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; } }
Вот как вы создаете сборщик:
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);
Это моя реализация, не стесняйтесь ее менять. Обратите внимание, что в этом коде по умолчанию задана дата currnet. Также важен newInstance.
источник
С библиотекой компонентов материалов просто используйте
MaterialDatePicker
и создайте свои собственные,DateValidator
или вы можете просто использоватьDateValidatorPointForward
предоставленные библиотекой.Что-то вроде:
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());
источник
Вы можете использовать эту строку в своем коде ...
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); } };
источник
calendar.add(Calendar.DATE, 0);
иCalendar calendar
сам, если не используется? Дата newDate = новая дата (); достаточно.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();
источник
Хорошо, поэтому я использую библиотеку MaterialDatePicker, и ее слишком просто установить на ней минимальную дату.
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);
источник
Вы можете использовать функцию DatePicker # setMinDate (), чтобы установить минимальную дату.
datePickerDialog.getDatePicker().setMinDate(calendar.getTimeInMillis());
источник
Я была такая же проблема. Вот как я это решил.
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(); }
Надеюсь, это кому-то поможет.
источник
Это зависит от того, что вы хотите отключить, если вы хотите установить минимальную дату до пары дней, тогда лучший подход - использовать LocalDateTime следующим образом:
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()
Вы устанавливаете новую местную дату и время до минус 30 дней с этого момента, а после этого вы устанавливаете, в каком часовом поясе он должен быть. В моем примере я использую время «Европа / Берлин», вы прикрепляете его к dpd. datePicker.minDate = ldt.toInstant (zoneOffSet) .toEpochMilli () установлен в epochMilli и все
источник
Котлин
Непосредственно к средству выбора даты:
datePicker.minDate = System.currentTimeMillis()
Если вы используете объект DatePickerDialog:
datePickerDialog.datePicker.minDate = System.currentTimeMillis()
источник