我知道对此有很多问题,但没有一个解决方案对我有用,所以这个问题。我想限制用户选择今天之前的日期,但我不能这样做。
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()
方法,但它没有效果。该对话框将今天之前的日期显示为灰色但可选择。
我还尝试按照一些 stackoverflow 答案中的建议对 DatePickerDialog
进行子类化并覆盖 onDateChanged
但没有任何成功。
最佳答案
试试这个方法
@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;
}
EDIT1:
我也遇到过这个问题,用户可以在 Android L 5.0.2
中选择不可选择的日期。目前报告了一个错误 here . Android L 5.1.0
中已解决。
对于此问题的临时解决方案,您可以将所选日期与当前系统日期进行比较,并在此基础上设置一些条件。我用这个作为我的解决方法
EDIT2:
在 DatePickerDialogFragment
中添加 onDateSent()
方法并检查它是否早于您在 setMinDate()
中设置的日期。如果是这样,那么只需再次显示 DatePickerDialog
。
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 : Set min and max date for selection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33051236/