android studio 禁用日期选择器中的天数

2023-12-14

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

我有这个代码来禁用日历中的日期

    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 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);
                        }
                    }


                }

我该如何解决?


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

具体来说,在您的问题中,您需要禁用特定日期;因此,您将创建一个实现的类CalendarConstraints.DateValidator, 进而:

  • 重写所需的方法,并构建一个 Parcelable

CalendarConstraints.DateValidator延伸Parcelable为了维持DateValidator穿过 设备配置更改。Parcelable在之间传递时中断 流程。

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

下面,我将提供一个禁用的验证器Mondays in Feb.2020;您可以以相同的方式轻松禁用任何一天。

实施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());

}

这是输出:

enter image description here

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android studio 禁用日期选择器中的天数 的相关文章

  • volatile、final 和synchronized 安全发布的区别

    给定一个带有变量 x 的 A 类 变量 x 在类构造函数中设置 A x 77 我们想将 x 发布到其他线程 考虑以下 3 种变量 x 线程安全 发布的情况 1 x is final 2 x is volatile 3 x 设定为同步块 sy
  • Java ResultSet 如何检查是否有结果

    结果集 http java sun com j2se 1 4 2 docs api java sql ResultSet html没有 hasNext 方法 我想检查 resultSet 是否有任何值 这是正确的方法吗 if resultS
  • Android - AudioRecord类不读取数据,audioData和fftArray返回零

    我是 Android 新手 一直在开发音调分析器应用程序 最低 SDK 8 我读了很多关于如何实现 Audiorecord 类的文章 但我想知道为什么它在我录制时不读取任何数据 我尝试显示 audioData 和 fftArray 的值 但
  • 在我的 Spring Boot 示例中无法打开版本 3 中的 Swagger UI

    我在 Spring Boot 示例中打开 swagger ui 时遇到问题 当我访问 localhost 8080 swagger ui 或 localhost 8080 root api name swagger ui 时出现这种错误 S
  • okhttp 获取失败响应

    我已经在我的 android 客户端中实现了 okhttp 来进行网络调用 当我收到失败响应时 我会收到失败代码以及与该代码相关的文本作为消息 但我没有收到服务器发送给我的自定义失败响应 在我实施的代码中的失败响应中 我收到的消息只是 错误
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • OnLongClickListener 不工作

    我有一个ImageView 我需要使用onLongClickListener对于图像视图 当我使用这段代码时 什么也没有发生 Code gallery Gallery findViewById R id gall1 gallery setA
  • 最新的 Hibernate 和 Derby:无法建立 JDBC 连接

    我正在尝试创建一个使用 Hibernate 连接到 Derby 数据库的准系统项目 我正在使用 Hibernate 和 Derby 的最新版本 但我得到的是通用的Unable to make JDBC Connection error 这是
  • 如何在 Android 中从 WorkManager 取消工作?

    我已经保存了 WorkManagerUUID转换成String在领域数据库中 这是代码 Constraints constraints new Constraints Builder setRequiredNetworkType Netwo
  • 您使用什么物理 Android 设备进行测试?

    有什么好的推荐用于测试目的的物理 Android 设备吗 我正在苹果阵营寻找像 iPod touch 这样的设备 可以帮助 iOS 开发人员测试他们的东西 我知道有 Nexus One 但那东西相当昂贵 而且我并不真正关心手机的东西 而是可
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • Android Studio 缓慢的增量构建

    我已经完成了许多步骤来完善我们的构建系统 those https stackoverflow com questions 16775197 building and running app via gradle and android st
  • 卡片视图 单击卡片移至新活动

    我是 Android 编程新手 正在研究卡片布局 我想知道如何使其可点击 android clickable true android foreground android attr selectableItemBackground 我的卡
  • 找不到符号 NOTIFICATION_SERVICE?

    package com test app import android app Notification import android app NotificationManager import android app PendingIn
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 问题:为什么React Native Video不能全屏播放视频?

    我正在react native 0 57 7 中为android和ios创建一个应用程序并使用反应本机视频 https github com react native community react native video播放上传到的视频
  • 没有支持 FEATURE_CAMERA_EXTERNAL 的 Android 设备

    根据this doc https source android com devices camera external usb cameras一些 Android 设备允许使用 Camera2 API 访问外部 USB 摄像头 我检查了大约
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 有没有任何代码可以在android中设置壁纸而无需裁剪和缩放?

    我正在创建一个画廊应用程序 我的第一个应用程序 这是我的代码 Bitmap bmd BitmapFactory decodeStream is try getApplicationContext setWallpaper bmd catch

随机推荐

  • Google BigQuery 架构与使用 load_table_from_dataframe 的数字数据类型发生冲突(pyarrow 错误)

    当我将数字数据 int64 或 float64 从 Pandas 数据帧上传到 数字 Google BigQuery 数据类型 pyarrow lib ArrowInvalid 获得长度为 8 的字节串 预期为 16 我尝试更改 Panda
  • RSpec测试数据库索引

    有没有办法用 RSpec 测试数据库索引是否存在 我在用着friendly id gem我经常忘记为 slug 字段创建数据库索引 因此 我想将其包含在我的 RSpec 测试中 您可以使用index exists check unique通
  • 调试时在 pool.close() 上抛出异常,但在运行时不会抛出异常

    我认为我在 Python 2 7 中处理这个问题时没有遇到这个问题 但是在 3 7 中调试时 Python 会抛出异常pool close 叫做 这是该函数的相关部分 pool multiprocessing Pool 6 iterator
  • 将 XYZ 文件中的不规则 3D 数据插值到规则网格

    我有一个包含大量 3D 坐标的 xyz 文件 如下所示 370373 771 6535261 431 2 908 370373 788 6535261 441 2 911 370373 787 6535261 442 2 909 37037
  • 如何使用 jQuery 删除父元素

    我的 jsp 中有一些列表项标签 每个列表项内部都有一些元素 包括一个称为 删除 的链接 a 标签 我想要的只是在单击链接时删除整个列表项 这是我的代码的结构 a click function event event preventDefa
  • MongoDB根据对象成员过滤对象数组内容

    我有以下对象数组 想知道是否有一种方法可以过滤结果 仅返回 QtyIn 记录或仅返回 QtyOut 记录 任何提示都将受到高度赞赏 感谢您的帮助 warehouseID 1234 transactions qtyIn 10 transDat
  • Python - beautifulsoup - 如何处理丢失的结束标签

    我想使用 beautifulsoup 从 html 代码中抓取表格 html 的片段如下所示 使用时table findAll tr 我得到整个表 而不仅仅是行 可能是因为 html 代码中缺少结束标签 table border 0 cel
  • Django FormWizards:如何在表单之间轻松传递用户输入的数据?

    我正在使用 Django 1 4 3 中的 FormWizard 功能 我已经成功创建了一个 4 步表单 在表单的前 3 个步骤中 它正确地从用户那里获取信息 验证信息等 在第 4 步中 它现在只显示一个 确认 按钮 没有其他的 当您在第
  • 连接到 Poloniex Push-API

    我想连接到Poloniex 的推送 API 他们在他们的页面上写着以下内容 要使用推送 API 请连接到 wss api poloniex com 并订阅所需的提要 wss WebSocket 安全 gt SSL 保护 他们还给出了 Nod
  • 对 Yesod 中的 selectOneMany 感到困惑

    甜蜜但简单 持久连接是如何工作的 考虑以下模型 Person number Int numberOfEyes Int firstName FirstnamesId lastName LastnamesId Lastnames lastnam
  • 根据子字符串中的数字对字符串进行排序

    我有一个像这样的字符串 is2 Thi1s T4est 3a 我需要对其进行排序 所以 该数组看起来像这样 Thi1s is2 3a T4est 数字可以出现在字符串中的任何位置 我知道如何按字母顺序对字符串进行排序以及如何对数字数组进行排
  • 使用 openpyxl 复制整个工作表

    请有人给我一个例子 如何复制带有样式的整个工作表 从行和列 到同一工作簿中的第二个工作表 也可以在新的工作簿中 谢谢 P S 我尝试进行深度复制 但未能保存更改的数据单元格 目的是 我尝试用我的数据填充一些工作表 第一个工作表是我的模板 我
  • 如何在 Lisp 中将函数存储在变量中并使用它

    我想存储一个像这样的函数print在一个变量中 这样我就可以输入一些简短的内容 例如p e g In Scheme define print display print Hello world n alternate way define
  • 通过 RewriteCond 和 .htaccess 对 RewriteRule 进行分组

    我有一个网页模板 用于运行多个登陆页面 htaccess 用于将友好 URL 定向到 PHP 代码中的 pageid 这一切都有效 但目前我必须在每个规则或重定向冲突之前添加重写条件行 您可以在下面的伪代码中看到这一点 RewriteEng
  • DynamoDB 中的复合键具有超过 2 列?

    我正在探索在我所处理的应用程序中使用 DynamoDB 该应用程序目前只有一个数据库组件 在 RDS 上运行的 MySQL 数据库 我们大量使用 AWS 并为我们的数据库使用分片方案 但如果没有人工干预 它只能让我们到目前为止 在使用 Au
  • 在 Visual Studio 中显示构建时间

    我们的构建服务器构建 C 项目之一花费的时间太长 它用视觉工作室2008 跑步devenv com MyApp sln Build see devenv 命令行开关 尽管这是针对较新版本的 VS 有没有办法让 devenv com 记录在解
  • 如何根据表单状态隐藏普通按钮

    我试图隐藏我的保存vanilla根据表单状态按钮 当表单状态 创建时 不应显示普通按钮 我尝试了不同的方法 但没有任何作用 我在 js 中创建一个函数 如果表单处于创建状态 则返回 true function isHideState for
  • 以编程方式安装 APK - 返回值

    在我的应用程序中 我从我的活动中调用 javascript 接口 在与此界面关联的 web 视图中 我要求用户下载并安装 APK 我正在使用 startActivityForResult 来启动安装过程 下载文件后 这是代码 Intent
  • 游戏在快速从后台恢复后退出暂停状态

    我正在使用 SpriteKit 开发一个游戏 可以在执行期间暂停并可以恢复 但我有一个问题applicationDidEnterBackground当游戏暂停时按下主页按钮时 因为当我恢复游戏时 即使游戏之前已暂停 实体也会立即开始移动 我
  • android studio 禁用日期选择器中的天数

    我想禁用日期选择器中的某一天 我有一个数组存储我想要禁用的日期 我有这个代码来禁用日历中的日期 for Calendar loopdate min date c min date c before max date c min date c