java - setMaxDate() 在 Lollipop 5.0.1 android 上无法完美运行,需要适当的解决方案

标签 java android datepicker

即使在将 setMaxDate() 应用于日期选择器之后,我仍然能够在 lollipop 5.0.1 上选择禁用的日期。该代码适用于除 lollipop 5.0.1 以外的所有其他版本的 android。

在通过设置 setMaxDate() 限制日期后,任何用户都不能选择禁用的日期。如何以编程方式为 DatePicker 实现此目的?

我试过下面的代码:-

datePickerDialog = new DatePickerDialog(myContext, new DatePickerDialog.OnDateSetListener() {
        @Override
        public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
        }
    }, mYear, mMonth, mDay);
    datePickerDialog.getDatePicker().setMaxDate(System.currentTimeMillis());
    datePickerDialog.setCanceledOnTouchOutside(true);
    datePickerDialog.setCancelable(true);
    datePickerDialog.show();

我也尝试了以下解决方案,但这些似乎不起作用:-

datePickerDialog.getDatePicker().setMaxDate(System.currentTimeMillis());

Calendar maxCal = Calendar.getInstance();
datePickerDialog.getDatePicker().setMaxDate(maxCal.getTimeInMillis());

Date maxDate = new Date();
datePickerDialog.getDatePicker().setMaxDate(maxDate.getTime());

请向 setMaxDate() 提供适用于 lollipop 的解决方案。

或者,如果您有任何其他答案,请尝试包括官方报价和资源或链接(如 android 开发者网站),如果您知道并提供简短的详细信息。提前致谢。

最佳答案

正如评论中已经指出的那样,这个有问题的日历没有真正完美的解决方案(在 Android 5.0 上你可以选择一个无效的日期,在一些三星设备上出现了一个奇怪的行为:按下后退按钮实际上是在选择一个日期和其他人我真的不记得了)。但是,当您可以通过检查其有效性并在失败时显示 Toast 来选择无效日期时,我解决了这个问题。这不会阻止用户实际选择无效日期,而是强制用户选择有效日期以继续使用该应用。

   DatePickerDialog dialog = new DatePickerDialog(getActivity(), mOnDateSetListener, year, month, day) {
        private boolean allowClose = false;

        @Override
        public void onBackPressed() {
            allowClose = true;
            super.onBackPressed();
        }

        @Override
        public void onClick(DialogInterface dialog, int which) {
            allowClose = true;
            if (which == DialogInterface.BUTTON_POSITIVE && !validate()) {
                allowClose = false;
                Toast.makeText(getContext(), R.string.invalid_date, Toast.LENGTH_SHORT).show();
            }
            if (allowClose) {
                super.onClick(dialog, which);
            }
        }

        @Override
        public void dismiss() {
            if (allowClose) {
                super.dismiss();
            }
        }
    };

通过使用它,您可以确保如果用户选择了一个无效日期,您将给他一个正确的警告消息并在您按下 Ok 按钮时阻止日历关闭。应该创建 validate 函数来满足您的需求,但我认为我所拥有的就可以了:

private boolean validate() {
    if (this.getDialog() instanceof DatePickerDialog) {
        DatePicker datePicker = ((DatePickerDialog) this.getDialog()).getDatePicker();
        Calendar calendar = Calendar.getInstance();
        calendar.set(Calendar.YEAR, datePicker.getYear());
        calendar.set(Calendar.MONTH, datePicker.getMonth());
        calendar.set(Calendar.DAY_OF_MONTH, datePicker.getDayOfMonth());
        calendar.set(Calendar.HOUR_OF_DAY, 0);
        calendar.set(Calendar.SECOND, 0);
        calendar.set(Calendar.MILLISECOND, 0);
        boolean valid = false;
        Calendar minCalendar = Calendar.getInstance();
        minCalendar.setTimeInMillis(datePicker.getMinDate());
        Calendar maxCalendar = Calendar.getInstance();
        maxCalendar.setTimeInMillis(datePicker.getMaxDate());
        if (DateUtils.in(calendar.getTime(), minCalendar.getTime(), maxCalendar.getTime())) {
            valid = true;
        }
        return valid;
    }
    return false;
}

最后,我不保证这是最好的解决方案,但我已经使用过它并且没有收到用户的任何投诉。

关于java - setMaxDate() 在 Lollipop 5.0.1 android 上无法完美运行,需要适当的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43908314/

相关文章:

java - 将 Java 按位 "and"运算符转换为 Kotlin

java - 缓存 YAML 文件

java - 为什么当我的结果集类型是 forward only 时我可以使用 first() 方法?

android - 为什么在Windows下为Android 2.3设置开发环境如此噩梦?

android - 无法绑定(bind)自定义 MvvmCross View

javascript - 在 JQuery Datepicker(文本字段)值选择上显示 Div

java - JNA : Pointer to array of Struct : Invalid Pointer

java - Android - 如何在图片点击时切换 Activity

javascript - $(..)DatePicker 不起作用 控制台中出现错误

javascript - jQuery Datepicker - 半天?