setMaxDate()在Lollipop 5.0.1 android上运行不正常,需要适当的解决方案

Nit*_*tel 11 java android datepicker

即使申请setMaxDate()了datepicker,我仍然可以在棒棒糖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();
Run Code Online (Sandbox Code Playgroud)

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

datePickerDialog.getDatePicker().setMaxDate(System.currentTimeMillis());
Run Code Online (Sandbox Code Playgroud)

Calendar maxCal = Calendar.getInstance();
datePickerDialog.getDatePicker().setMaxDate(maxCal.getTimeInMillis());
Run Code Online (Sandbox Code Playgroud)

Date maxDate = new Date();
datePickerDialog.getDatePicker().setMaxDate(maxDate.getTime());
Run Code Online (Sandbox Code Playgroud)

请提供适用于棒棒糖的解决方案setMaxDate().

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

Iul*_*scu 6

正如评论中已经指出的那样,对于这个错误的日历没有真正完美的解决方案(在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();
            }
        }
    };
Run Code Online (Sandbox Code Playgroud)

通过使用此功能,您可以确保如果用户选择了无效日期,您将向他发出正确的警告消息,并在按下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;
}
Run Code Online (Sandbox Code Playgroud)

最后,我不保证这是最好的解决方案,但我使用过它并没有收到用户的任何抱怨.


Nit*_*tel 3

是的,我找到了一个wdullaer/MaterialDateTimePickerdatePicker 库,它在lollipop 5.0.1中运行得很好,就像在其他 API 版本中一样。

解决方案库的链接是Click Here For MaterialDateTimePicker

通过在(应用程序)文件的dependency{...}中添加以下行来添加此库build.gradle

compile 'com.wdullaer:materialdatetimepicker:3.2.1'
Run Code Online (Sandbox Code Playgroud)

然后根据需要实现以下代码:-

MainActivity mainActivity = (MainActivity) myContext;
    final DatePickerDialog dpd = DatePickerDialog.newInstance(
            new DatePickerDialog.OnDateSetListener() {
                @Override
                public void onDateSet(DatePickerDialog view, int year, int monthOfYear, int dayOfMonth) {
                    //To do your task here
                }
            },
            mYear,
            mMonth,
            mDay
    );
    dpd.setVersion(DatePickerDialog.Version.VERSION_2);
    dpd.setMaxDate(Calendar.getInstance());
    dpd.show(mainActivity.getFragmentManager(), "Datepickerdialog");
Run Code Online (Sandbox Code Playgroud)