Reputation: 7233
I know there are quite a lot of question for this but none of the solutions are working for me, so this question. I want to restrict user to select date before today, but am not able to do so.
public class DatePickerDialogFragment extends DialogFragment {
private OnDateSetListener listener;
public void setListener(OnDateSetListener listener) {
this.listener = listener;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dialog = new DatePickerDialog(getContext(), listener, year, month, day);
dialog.getDatePicker().setMinDate(calendar.getTimeInMillis());
return dialog;
}
}
I am showing it as:
DatePickerDialogFragment fragment = new DatePickerDialogFragment();
fragment.setListener(dateSetListener);
fragment.show(getSupportFragmentManager(), "Choose booking date");
I want the user should not be able to select date before today. As you can see I called setMinDate()
method with today's time but it as no effect. The dialog shows dates before today as grayed but selectable.
I also tried to sub-class DatePickerDialog
and override onDateChanged
as suggested in some stackoverflow answers but without any success.
Upvotes: 20
Views: 54520
Reputation: 1412
Android DatePickerDialog: Set min and max date for selection to show allowed dates from 16 to 30 Aug 2022.
// Month is 0 based for Calendar.
final Calendar cMax = Calendar.getInstance();
// CMax.set(mYear, mMonth-1, mDay)
cMax.set(2022,7,30); // for date 30/Aug/2022
XXDatePicker.setMaxDate(cMax.getTimeInMillis());
final Calendar cMin = Calendar.getInstance();
// CMin.set(mYear, mMonth-1, mDay)
cMin.set(2022,7,16); // for date 16/Aug/2022
XXDatePicker.setMinDate(cMin.getTimeInMillis());
Upvotes: 0
Reputation: 11
mdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final Calendar calendar = Calendar.getInstance();
//set time zone
calendar.setTimeZone(TimeZone.getTimeZone("UTC"));
int selectedYear = calendar.get(Calendar.YEAR);
int selectedMonth = calendar.get(Calendar.MONTH);
int selectedDay = calendar.get(Calendar.DAY_OF_MONTH);
DatePickerDialog datePickerDialog = new DatePickerDialog(BrandResturant_DetailActivity.this,
new DatePickerDialog.OnDateSetListener() {
public void onDateSet(DatePicker view, int selectedYear,
int selectedMonth, int selectedDay) {
mDay = selectedDay;
mMonth = selectedMonth;
mYear = selectedYear;
StringBuilder Date = new StringBuilder("");
String conver = Integer.toString(selectedYear);
Date.append(conver);
Date.append("-");
selectedMonth++;
conver = Integer.toString(selectedMonth);
Date.append(conver);
Date.append("-");
conver = Integer.toString(selectedDay);
Date.append(conver);
isDob = true;
}
}, mDay, mMonth, mYear);
datePickerDialog.getDatePicker().setMaxDate(calendar.getTimeInMillis());
//Getting Today date to calendar2
final Calendar calendar2 = Calendar.getInstance();
//Set Minimum date of calendar
calendar2.set(2021, 1, 3);
datePickerDialog.getDatePicker().setMinDate(calendar2.getTimeInMillis());
datePickerDialog.setTitle("Select Date");
datePickerDialog.show();
//Getting Today date to calendar3
final Calendar calendar3 = Calendar.getInstance();
//Set Maximum date of calendar - Method 1
calendar3.set(2021, 3, 3);
//Set Maximum One Month date from today(calendar3) date to calendar -Method 2
//In Place of month u can also set year, day
//calendar3.add(Calendar.MONTH, 1);
datePickerDialog.getDatePicker().setMaxDate(calendar3.getTimeInMillis());
datePickerDialog.setTitle("Select Date");
datePickerDialog.show();
}
});
Upvotes: -1
Reputation: 51
In the XML File
<DatePicker
android:minDate="mm/dd/yyyy"
android:maxDate="mm/dd/yyyy" >
ex:
android:minDate="10/12/2000"
android:maxDate="10/12/2000"
Upvotes: 1
Reputation: 1539
I set the minimum date using the method to the current year which is 2020-05-20
like this
datePickerDialog.getDatePicker().setMinDate(calendar.getTimeInMillis());
The moment you click the date picker it displays 2020 as the minimum year
I hope the answer helps.
Upvotes: 1
Reputation: 12861
Try this method
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dialog = new DatePickerDialog(getContext(), listener, year, month, day);
Field mDatePickerField;
try {
mDatePickerField = dialog.getClass().getDeclaredField("mDatePicker");
mDatePickerField.setAccessible(true);
} catch (Exception e) {
e.printStackTrace();
}
dialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);
return dialog;
}
instead of your
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dialog = new DatePickerDialog(getContext(), listener, year, month, day);
dialog.getDatePicker().setMinDate(calendar.getTimeInMillis());
return dialog;
}
EDIT1:
I have also faced this issue that user can select not-selectable dates in Android L 5.0.2
. Currently there is bug reported here. It is solved in Android L 5.1.0
.
For temporary solution of this issue you can compare selected date with current system date and put some condition based on that. I used this as my workaround
EDIT2:
add onDateSent()
method in DatePickerDialogFragment
and just check if it's earlier than the date you set in setMinDate()
. If so, then just show the DatePickerDialog
again.
final long today = System.currentTimeMillis() - 1000;
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
Calendar calendar = Calendar.getInstance();
calendar.set(year, monthOfYear, dayOfMonth);
//If user tries to select date in past (or today)
if (calendar.getTimeInMillis() < today)
{
//Make them try again
DatePickerDialogFragment fragment = new DatePickerDialogFragment();
fragment.setListener(dateSetListener);
fragment.show(getSupportFragmentManager(), "Choose booking date");
Toast.makeText(this, "Invalid date, please try again", Toast.LENGTH_LONG).show();
}
else
{
//success
}
}
Upvotes: 31
Reputation: 6834
Get System Time and subtract 1 second from It
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
dialog = new DatePickerDialog(act, listener, year, month, day);
dialog.getDatePicker().setMinDate(System.currentTimeMillis() -1000);
return dialog;
}
Upvotes: 10
Reputation: 991
Above API 11 For min date you can use
android:minDate="mm/dd/yyyy"
or setMinDate(long time)
For Max date
android:maxDate="mm/dd/yyyy"
// In XML
setMaxDate(new Date().getTime());
// Current time
Upvotes: 3