【问题标题】:android studio disable days from date pickerandroid studio 禁用日期选择器中的天数
【发布时间】:2020-03-02 13:46:29
【问题描述】:

我想从日期选择器中禁用某天 我有一个数组来存储我想要禁用的日期。

我有这段代码可以禁用日历中的日期

    for (Calendar loopdate = min_date_c;
                     min_date_c.before(max_date_c);
                     min_date_c.add(Calendar.DATE, 1), loopdate = min_date_c) {
                    int dayOfWeek = loopdate.get(Calendar.DAY_OF_WEEK);


                    if (dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.FRIDAY) {
                        Calendar[] disabledDays = new Calendar[1];
                        disabledDays[0] = loopdate;
                        datePickerDialog.setDisabledDays(disabledDays);
                    }
                }

我尝试使用此代码禁用存储在 arraylist 中的日期,但它不起作用。它只禁用数组列表中的第一项

   ArrayList a=new ArrayList();
            a.add(1);  //saturday
            a.add(2);  //sunday
            a.add(3);  //monday
            int day;


            for(int i=0; i<a.size();i++) {

                day=(Integer)a.get(i);



                for (Calendar loopdate = min_date_c;
                     min_date_c.before(max_date_c);
                     min_date_c.add(Calendar.DATE, 1), loopdate = min_date_c) {
                    int dayOfWeek = loopdate.get(Calendar.DAY_OF_WEEK);



                    if (day == 1) {
                        System.out.println(day);
                        if (dayOfWeek == Calendar.SATURDAY || dayOfWeek == Calendar.FRIDAY) {
                            Calendar[] disabledDays = new Calendar[1];
                            disabledDays[0] = loopdate;
                            datePickerDialog.setDisabledDays(disabledDays);
                        }
                    }

                  else  if (day==2) {
                        System.out.println(day);

                        if (dayOfWeek == Calendar.SUNDAY || dayOfWeek == Calendar.FRIDAY) {
                            Calendar[] disabledDays = new Calendar[1];
                            disabledDays[0] = loopdate;
                            datePickerDialog.setDisabledDays(disabledDays);
                        }
                    }

                   else if (day==3) {
                        System.out.println(day);
                        if (dayOfWeek == Calendar.MONDAY || dayOfWeek == Calendar.FRIDAY) {
                            Calendar[] disabledDays = new Calendar[1];
                            disabledDays[0] = loopdate;
                            datePickerDialog.setDisabledDays(disabledDays);
                        }
                    }


                }

我该如何解决这个问题?

【问题讨论】:

  • 经过编辑以提高可读性

标签: java android datetime datepicker android-calendar


【解决方案1】:

您可以使用材料设计组件MaterialDatePicker更轻松高效地控制日历;它允许您通过实现CalendarConstraints.DateValidator 接口来控制日历的每一天。

特别是在您的问题中,您需要禁用特定日期;因此,您将创建一个实现CalendarConstraints.DateValidator 的类,然后:

  • 覆盖所需的方法,并构建 Parcelable

CalendarConstraints.DateValidator 扩展 Parcelable 以保持 DateValidator 跨越 设备配置更改。 Parcelable 之间传递时中断 进程。

  • 覆盖isValid(long date) 验证每个日期的方法 在日历中并返回一个boolean,表明这是否 日期是否有效,即日期是否启用或禁用/变暗;因此,如果日期有效,则返回 true,并且该日期将可供用户选择。

在下文中,我将在 Feb.2020 提供一个禁用 Mondays 的验证器;并且您可以以相同的方式轻松禁用任何日期。

实现CalendarConstraints.DateValidator

static class MondaysOutValidator implements CalendarConstraints.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;

    }


    private static int getFirstXDayOfMonth(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);
    }

    private static 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 Week
        while (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
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeInt(mYear);
        dest.writeInt(mMonth);
        dest.writeInt(mDayOfWeek);
    }

    public static final Parcelable.Creator<MondaysOutValidator> CREATOR = new Parcelable.Creator<MondaysOutValidator>() {

        @Override
        public MondaysOutValidator createFromParcel(Parcel parcel) {
            return new MondaysOutValidator(parcel);
        }

        @Override
        public MondaysOutValidator[] newArray(int size) {
            return new MondaysOutValidator[size];
        }
    };


}

然后使用此验证器构建 CalendarConstraints 以便将这些约束应用于日历日期

/*
 * 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;
}

最后在您的活动/片段中构建您的MaterialDatePicker

@Override
protected void onCreate(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());

}

这是输出:

希望对您有所帮助,并欢迎进一步支持。

【讨论】:

  • 哦,非常感谢它真的很有用...非常感谢您给我时间...
【解决方案2】:

我使用此代码显示没有天数的日期选择器

DatePickerDialog datePickerDialog = new DatePickerDialog(
        RacingRsActivity.this,
        android.R.style.Theme_Holo_Dialog,
        new DatePickerDialog.OnDateSetListener() {
            @Override
            public void onDateSet(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();

【讨论】:

  • 没有日常?
  • 只选择月份和年份。
  • 不,我希望我的日历有(日、月、年),但禁用某些特定的日子,例如(星期日、星期三、星期五)或我想要在我的数组中的任何其他日子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 2020-12-15
相关资源
最近更新 更多