Android DatePickerDialog : Set min and max date for selection

标签 android android-datepicker

我知道对此有很多问题,但没有一个解决方案对我有用,所以这个问题。我想限制用户选择今天之前的日期,但我不能这样做。

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/

相关文章:

java - 如何以编程方式从 Android 中的 DatePicker/TimePicker Spinner 中提取值?

android - 更改新 MaterialDatePicker 中的按钮文本

Android:唤醒和解锁手机

android - java.io.FileNotFoundException : fileprovider 错误

c# - Android View 状态 : pressed, 已激活、已选择等绑定(bind)。我必须编写自定义绑定(bind)吗?

java - 创建自定义分页指示器

android - android 5 lollipop 中的日期选择器对话框问题

android - 如何将日期和时间添加到android中的textview

android - 如何在 DatePickerDialog 上仅启用当前日期和前 7 天之间的日期?

android - 如何从谷歌自定义搜索 api 获取无限查询