如何在日期选择对话框中设置日期限制

9
我希望您能设置日期限制,这样用户就不能选择超过限制的日期。例如,如果今天是1月1日,那么用户就不能选择超过7天的日期,也就是说他不能选择1月9日。我还希望用户不能选择月份和年份。因此,我将限制设置为一周内完成任务。
到目前为止,我已经显示了日期选择器片段并在其中设置了当前日期。我的主要活动中的代码如下:
etSelectDate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DialogFragment datePickerFragment = new DatePickerFragment() {
                    @Override
                    public void onDateSet(DatePicker view, int year, int month, int day) {
                        Log.d("Date Change", "onDateSet");
                        Calendar c = Calendar.getInstance();
                        c.set(year, month, day);
                        DateFormat df = DateFormat.getDateInstance();
                        etSelectDate.setText(df.format(c.getTime()));
                        //nextField.requestFocus(); //moves the focus to something else after dialog is closed

                    }
                };
                datePickerFragment.show(MainActivity.this.getSupportFragmentManager(), "datePicker");

            }
        });

日期选择器片段类如下所示:
 public static class DatePickerFragment extends DialogFragment implements DatePickerDialog.OnDateSetListener{

        @Override
        public Dialog onCreateDialog(Bundle savedInstanceState) {
            // Use the current date as the default date in the picker
            final Calendar c = Calendar.getInstance();
            int year = c.get(Calendar.YEAR);
            int month = c.get(Calendar.MONTH);
            int day = c.get(Calendar.DAY_OF_MONTH);

            // Create a new instance of DatePickerDialog and return it
            return new DatePickerDialog(getActivity(), this, year, month, day);
        }

        @Override
        public void onDateSet(DatePicker view, int year, int month, int day) {
            //blah
        }
    }

目前它运行良好,但我不知道如何设置日期限制,使得其余的月份和年份都不能被选择。我看到了很多链接,例如像这个,但我不明白该如何做,而且android网站上也没有实用的信息。

所以请帮助我,如何只设置七天的限制?

更新

通过您的回复,我知道如何在日历中设置最大日期,但是我仍然无法实现将最大日期设置为当前日期后的7天。到目前为止,我读到的方法是:

pickerDialog.getDatePicker().setMaxDate(new Date().getTime());

它将当前日期设置为最大值,但是由于它是日期对象,我该如何在其中添加7天呢?请帮忙。


你可以在这里查看完整的讨论线程:https://dev59.com/WWMl5IYBdhLWcg3wmn_R - strike
请查看此链接 https://dev59.com/WmQn5IYBdhLWcg3wiXqd#45671497 - Manohar
我正在使用日期选择器。它的工作正常。但是当打开选择器时,我需要将默认年份显示为十年前。但是如果用户滚动,则需要显示到当前年份。是否有任何方法可以在小部件中显示默认日期,并在向上或向下滚动时像平常一样显示年份。 - sejn
4个回答

20

您可以使用setMinDate(long)setMaxDate(long)方法。这两个方法都适用于API级别11及以上的版本。由于您正在使用DatePickerDialog,因此需要先调用getDatePicker()方法获取底层的DatePicker。

dpdialog.getDatePicker().setMinDate(minDate);  
dpdialog.getDatePicker().setmaxDate(maxDate);  

来源:在Android中设置DatePickerDialog的限制?

你可以通过以下方式计算minDate:

Date today = new Date();
Calendar c = Calendar.getInstance();
c.setTime(today);
c.add( Calendar.MONTH, -6 ) // Subtract 6 months
long minDate = c.getTime().getTime() // Twice!  

更新时间:

替换以下行:

return new DatePickerDialog(getActivity(), this, year, month, day);
 // Create a new instance of DatePickerDialog and return it
    DatePickerDialog pickerDialog = new DatePickerDialog(getActivity(), this, year, month, day);
    pickerDialog.getDatePicker().setMaxDate(maxDate);
    pickerDialog.getDatePicker().setMinDate(minDate);
    return pickerDialog;

我之前看到过这个帖子,但是在我的情况下,我该如何实现呢? - stacy queen
那么我如何在最大日期上设置七天的限制?最小日期肯定是当前日期吗? - stacy queen
你的解决方案帮了我很多,但是它还存在一个问题。 - stacy queen
@stacyqueen 有什么问题吗? - Kartheek
在设置了datePicker的setMaxDate之后,setMaxDate总是被突出显示和选中,这里是图片 - hasnain_ahmad
显示剩余2条评论

11

在某些情况下,如果你设置了没有小时和分钟的日期作为最大日期,你将无法选择你所设置的最大日期。例如:

 Calendar maxDate = Calendar.getInstance();
            maxDate.set(Calendar.DAY_OF_MONTH, day + 5);
            maxDate.set(Calendar.MONTH, month);
            maxDate.set(Calendar.YEAR, year);

 datePickerDialog.getDatePicker().setMaxDate(maxDate.getTimeInMillis());

通过上面的代码块,您无法点击您的最大日期。

但是如果您添加小时和分钟,例如;

            maxDate.set(Calendar.HOUR, 23);
            maxDate.set(Calendar.MINUTE, 59);

在您的最大日期之前,您的最后日期将可点击。


1

请您能详细说明一下吗?我可以在哪里使用它,以及使用哪种格式? - stacy queen

0

试试这个

DatePickerDialog dpDialog = new DatePickerDialog(this, pDateSetListener, pYear, pMonth, pDay);
DatePicker datePicker = dpDialog.getDatePicker();

Calendar calendar = Calendar.getInstance();//get the current day
datePicker.setMaxDate(calendar.getTimeInMillis());//set the current day as the max date or put yore date in miliseconds.
datePicker.setMinDate(calendar.getTimeInMillis());//set the current day as the min date or put your date in mili seconds format
return dpDialog;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接