setMaxDate()不能在Lollipop 5.0.1 android上完美工作,需要适当的解决scheme

即使在应用setMaxDate()setMaxDate()后,我仍然可以select棒棒糖5.0.1上的禁用date。 代码工作正常,除了棒棒糖5.0.1以外的所有其他版本的Android。

在通过设置setMaxDate()限制date之后,没有用户应该能够select禁用的date。 我怎样才能达到这个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(); 

此外我尝试了下面的解决scheme,但这些似乎并没有工作: –

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

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

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

请提供适用于棒棒糖的解决schemesetMaxDate()

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

Solutions Collecting From Web of "setMaxDate()不能在Lollipop 5.0.1 android上完美工作,需要适当的解决scheme"

正如在评论中已经指出,这个错误的日历没有真正完美的解决scheme(在Android 5.0上,您可以select一个无效的date,在一些三星设备上出现了一个奇怪的行为:按下后退button其实是select一个date和其他人真的不记得)。 但是,我可以通过检查其有效性并在出现故障时显示Toast来select无效date。 这不会停止用户实际select无效的date,而是强制用户select一个有效的date,以继续使用该应用程序。

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

通过使用这个,你要确保如果用户select一个无效的date,你会给他一个正确的警告信息,并停止日历closures,当你按下Okbutton。 validate函数应该创build,以适应您的需求,但我认为,我有什么会做得很好:

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

总而言之,我不能保证这是最好的解决scheme,但我已经使用了它,并没有收到用户的任何抱怨。

您需要添加日历实例并将其用作maxDate。 请参阅下面的代码中添加的行。

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

是的,我已经find了一个库wdullaer/MaterialDateTimePicker for datePicker,它在棒棒糖5.0.1中 完美工作,就像在其他API版本的工作。

解决scheme库的链接是点击这里MaterialDateTimePicker

通过在build.gradle (app)文件的依赖关系{…}中添加下面的行来添加此库。

 compile 'com.wdullaer:materialdatetimepicker:3.2.1' 

然后根据需要执行下面的代码: –

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