Android Studio Disable Days From Date Picker
Solution 1:
You can use the material design component MaterialDatePicker
to control the calendar more easily and efficiently; it allows you to control every single day of the calendar by implementing CalendarConstraints.DateValidator
interface.
Specificlly in your issue, you need to disable particular days; so, you will create a class that implements CalendarConstraints.DateValidator
, and then:
- Override the needed methods, and build a Parcelable
CalendarConstraints.DateValidator
ExtendsParcelable
in order to maintain theDateValidator
across device configuration changes.Parcelable
breaks when passed between processes.
- Override
isValid(long date)
method that validates every single date in the calendar and returns aboolean
that indicates whether this date is valid or not, in other meaning if the date is enabled or disabled/dimmed; so, if a date is valid, then it returns true, and that date will be enabled for selection by the user.
Hereunder, I will provide a Validator that disable Mondays in Feb.2020; and you can easily disable any days the same manner.
Implementing CalendarConstraints.DateValidator
:
staticclassMondaysOutValidatorimplementsCalendarConstraints.DateValidator {
int mYear, mMonth, mDayOfWeek;
MondaysOutValidator(int year, int month, int dayOfWeek) {
mYear = year;
mMonth = month;
mDayOfWeek = dayOfWeek;
}
MondaysOutValidator(Parcel parcel) {
mYear = parcel.readInt();
mMonth = parcel.readInt();
mDayOfWeek = parcel.readInt();
}
@Override
public boolean isValid(long date) {
List<Integer> allXDayOfMonth = getAllXDayOfMonth(mYear, mMonth, mDayOfWeek);
boolean isValidDays = false;
for (int xDay : allXDayOfMonth) {
Calendar calendarStart = Calendar.getInstance();
Calendar calendarEnd = Calendar.getInstance();
ArrayList<Long> minDate = new ArrayList<>();
ArrayList<Long> maxDate = new ArrayList<>();
calendarStart.set(mYear, mMonth, xDay - 1);
calendarEnd.set(mYear, mMonth, xDay);
minDate.add(calendarStart.getTimeInMillis());
maxDate.add(calendarEnd.getTimeInMillis());
isValidDays = isValidDays || !(minDate.get(0) > date || maxDate.get(0) < date);
}
return !isValidDays;
}
privatestaticintgetFirstXDayOfMonth(int year, int month, int dayOfWeek) {
Calendar cacheCalendar = Calendar.getInstance();
cacheCalendar.set(Calendar.DAY_OF_WEEK, dayOfWeek);
cacheCalendar.set(Calendar.DAY_OF_WEEK_IN_MONTH, 1);
cacheCalendar.set(Calendar.MONTH, month);
cacheCalendar.set(Calendar.YEAR, year);
return cacheCalendar.get(Calendar.DATE);
}
privatestatic List<Integer> getAllXDayOfMonth(int year, int month, int dayOfWeek) {
final int ONE_WEEK = 7;
int firstDay = getFirstXDayOfMonth(year, month, dayOfWeek);
List<Integer> xDays = new ArrayList<>();
xDays.add(firstDay);
Calendar calendar = new GregorianCalendar(year, month, firstDay);
calendar.add(Calendar.DAY_OF_MONTH, ONE_WEEK); // adding 1 Weekwhile (calendar.get(Calendar.MONTH) == month) {
xDays.add(calendar.get(Calendar.DAY_OF_MONTH));
calendar.add(Calendar.DAY_OF_MONTH, ONE_WEEK); // adding 1 Week
}
return xDays;
}
@Override
publicintdescribeContents() {
return0;
}
@Override
publicvoidwriteToParcel(Parcel dest, int flags) {
dest.writeInt(mYear);
dest.writeInt(mMonth);
dest.writeInt(mDayOfWeek);
}
publicstatic final Parcelable.Creator<MondaysOutValidator> CREATOR = new Parcelable.Creator<MondaysOutValidator>() {
@Override
public MondaysOutValidator createFromParcel(Parcel parcel) {
returnnew MondaysOutValidator(parcel);
}
@Override
public MondaysOutValidator[] newArray(int size) {
returnnew MondaysOutValidator[size];
}
};
}
Then use this validator to build CalendarConstraints
in order to apply these constraints on the calendar dates
/*
* Limit selectable range to days other than Mondays of the month
*/private CalendarConstraints.Builder mondayDisableConstraints() {
CalendarConstraints.Builder constraintsBuilderRange = new CalendarConstraints.Builder();
constraintsBuilderRange.setValidator(new MondaysOutValidator(2020, Calendar.FEBRUARY, Calendar.MONDAY));
return constraintsBuilderRange;
}
And finally build your MaterialDatePicker
in your activity/fragment
@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
MaterialDatePicker.Builder<Long> builderRange = MaterialDatePicker.Builder.datePicker();
builderRange.setCalendarConstraints(mondayDisableConstraints().build());
builderRange.setTitleText("Select Date Range");
MaterialDatePicker<Long> pickerRange = builderRange.build();
pickerRange.show(getSupportFragmentManager(), pickerRange.toString());
}
And this is the output:
Wish that can help you out, and welcome for further support.
Solution 2:
I use this code to show datepicker without days
DatePickerDialogdatePickerDialog=newDatePickerDialog(
RacingRsActivity.this,
android.R.style.Theme_Holo_Dialog,
newDatePickerDialog.OnDateSetListener() {
@OverridepublicvoidonDateSet(DatePicker view, int year,
int monthOfYear, int dayOfMonth) {
dateRc.setText(DateUtil.getCalendarHeaderDate(getDateFromDatePicker(view)));
mYear = year;
mMonth = monthOfYear;
mDay = dayOfMonth;
}
},
mYear, mMonth, mDay);
datePickerDialog.getDatePicker().findViewById(getResources().getIdentifier("day", "id", "android")).setVisibility(View.GONE);
datePickerDialog.show();
Post a Comment for "Android Studio Disable Days From Date Picker"