Android DatePickerDialog:设置选择的最小和最大日期 [英] Android DatePickerDialog: Set min and max date for selection
问题描述
我知道对此有很多问题,但是没有一种解决方案对我有用,所以这个问题.我想限制用户选择今天之前的日期,但不能这样做.
I know there are quite a lot of question for this but none of the solutions are working for me, so this question. I want to restrict user to select date before today, but am not able to do so.
public class DatePickerDialogFragment extends DialogFragment {
private OnDateSetListener listener;
public void setListener(OnDateSetListener listener) {
this.listener = listener;
}
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dialog = new DatePickerDialog(getContext(), listener, year, month, day);
dialog.getDatePicker().setMinDate(calendar.getTimeInMillis());
return dialog;
}
}
我将其显示为:
DatePickerDialogFragment fragment = new DatePickerDialogFragment();
fragment.setListener(dateSetListener);
fragment.show(getSupportFragmentManager(), "Choose booking date");
我希望用户不能选择今天之前的日期.如您所见,今天的时间我调用了setMinDate()
方法,但没有效果.该对话框将今天之前的日期显示为灰色但可以选择.
I want the user should not be able to select date before today. As you can see I called setMinDate()
method with today's time but it as no effect. The dialog shows dates before today as grayed but selectable.
我也尝试按照某些stackoverflow答案中的建议对DatePickerDialog
进行子类化并覆盖onDateChanged
,但没有成功.
I also tried to sub-class DatePickerDialog
and override onDateChanged
as suggested in some stackoverflow answers but without any success.
推荐答案
尝试此方法
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dialog = new DatePickerDialog(getContext(), listener, year, month, day);
Field mDatePickerField;
try {
mDatePickerField = dialog.getClass().getDeclaredField("mDatePicker");
mDatePickerField.setAccessible(true);
} catch (Exception e) {
e.printStackTrace();
}
dialog.getDatePicker().setMinDate(System.currentTimeMillis() - 1000);
return dialog;
}
代替您的
@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);
DatePickerDialog dialog = new DatePickerDialog(getContext(), listener, year, month, day);
dialog.getDatePicker().setMinDate(calendar.getTimeInMillis());
return dialog;
}
我也遇到了这个问题,用户可以在Android L 5.0.2
中选择不可选择的日期.当前有报告的错误
I have also faced this issue that user can select not-selectable dates in Android L 5.0.2
. Currently there is bug reported here. It is solved in Android L 5.1.0
.
对于此问题的临时解决方案,您可以将所选日期与当前系统日期进行比较,并根据此日期设置一些条件.我将其用作解决方法
For temporary solution of this issue you can compare selected date with current system date and put some condition based on that. I used this as my workaround
在DatePickerDialogFragment
中添加onDateSent()
方法,只需检查它是否早于在setMinDate()
中设置的日期即可.如果是这样,则只需再次显示DatePickerDialog
.
add onDateSent()
method in DatePickerDialogFragment
and just check if it's earlier than the date you set in setMinDate()
. If so, then just show the DatePickerDialog
again.
final long today = System.currentTimeMillis() - 1000;
@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
Calendar calendar = Calendar.getInstance();
calendar.set(year, monthOfYear, dayOfMonth);
//If user tries to select date in past (or today)
if (calendar.getTimeInMillis() < today)
{
//Make them try again
DatePickerDialogFragment fragment = new DatePickerDialogFragment();
fragment.setListener(dateSetListener);
fragment.show(getSupportFragmentManager(), "Choose booking date");
Toast.makeText(this, "Invalid date, please try again", Toast.LENGTH_LONG).show();
}
else
{
//success
}
}
这篇关于Android DatePickerDialog:设置选择的最小和最大日期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!