Wie kann ich vergangene Daten in meiner Android-Datumsauswahl deaktivieren?
Hier ist der Code, der meinen DatePicker erzeugt:
@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(" "));
}
};
Antworten:
Du kannst tun
datePicker.setMinDate(System.currentTimeMillis() - 1000);
Hiermit wird das heutige Datum als Mindestdatum festgelegt und alle vergangenen Daten werden deaktiviert.
datePicker
ist ein Objekt,DatePicker
wenn Sie ein Objekt verwenden, dasDatePickerDialog
Sie tun könnendatePickerDialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);
Hinweis:
setMinDate
wurde in API 11 eingeführtquelle
-1000
?Diese Methode funktioniert ordnungsgemäß.
quelle
So mache ich es:
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; } }
So instanziieren Sie den 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);
Dies ist meine Implementierung. Sie können sie jederzeit ändern. Beachten Sie, dass dieser Code Mindate standardmäßig als Currnet-Datum festlegt. Auch die newInstance ist wichtig.
quelle
Verwenden Sie mit der Material Components Library einfach die
MaterialDatePicker
und erstellen Sie Ihre eigeneDateValidator
oder verwenden Sie einfach dieDateValidatorPointForward
von der Bibliothek bereitgestellte.Etwas wie:
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());
quelle
Sie können diese Zeile in Ihren Code verwenden ...
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); } };
quelle
calendar.add(Calendar.DATE, 0);
und für sichCalendar calendar
selbst, wenn es nicht verwendet wird? Datum newDate = neues Datum (); reicht.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();
quelle
Ok, ich verwende die MaterialDatePicker- Bibliothek und es ist zu einfach, ein Mindestdatum festzulegen.
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);
quelle
Mit der Funktion DatePicker # setMinDate () können Sie ein Mindestdatum festlegen.
datePickerDialog.getDatePicker().setMinDate(calendar.getTimeInMillis());
quelle
Ich hatte das gleiche Problem. Hier ist, wie ich es gelöst habe.
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(); }
Hoffe es hilft jemandem.
quelle
Dies hängt davon ab, was Sie deaktivieren möchten, wenn Sie das Mindestdatum auf ein paar Tage festlegen möchten. Am besten verwenden Sie LocalDateTime wie folgt:
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()
Sie stellen die neue lokale Datums- und Uhrzeit auf bis zu minus 30 Tage ein und legen anschließend fest, in welcher Zeitzone sie für mein Beispiel verwendet werden soll. Ich verwende die Zeit "Europa / Berlin". Sie hängen sie an dpd an. datePicker.minDate = ldt.toInstant (zoneOffSet) .toEpochMilli () auf epochMilli gesetzt und fertig
quelle
Kotlin
Direkt zur Datumsauswahl:
datePicker.minDate = System.currentTimeMillis()
Wenn Sie ein Objekt von DatePickerDialog verwenden:
datePickerDialog.datePicker.minDate = System.currentTimeMillis()
quelle