Android DatePickerDialog:设置选择的最小和最大日期

Posted

技术标签:

【中文标题】Android DatePickerDialog:设置选择的最小和最大日期【英文标题】:Android DatePickerDialog: Set min and max date for selection 【发布时间】:2016-01-08 04:01:51 【问题描述】:

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

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() 方法,但它没有效果。该对话框将今天之前的日期显示为灰色但可选择。

我还尝试按照一些 *** 答案中的建议对DatePickerDialog 进行子类化并覆盖onDateChanged,但没有任何成功。

【问题讨论】:

不是智能完成而是onDateSet,应该将结果与最小值和最大值进行比较 @Abdullah 你有没有为此找到任何解决办法? @RethinavelPillai 我最终做了接受的帖子中提到的事情。 查看 mycustom datepickerdialog github.com/Redman1037/EightFoldsDatePickerDialog 【参考方案1】:

试试这个方法

@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
            

【讨论】:

感谢您的更新。最终我也做了同样的事情。【参考方案2】:

获取系统时间并从中减去 1 秒

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

     dialog = new DatePickerDialog(act, listener, year, month, day);
     dialog.getDatePicker().setMinDate(System.currentTimeMillis() -1000);
     return dialog;
 

【讨论】:

【参考方案3】:
dialog.getDatePicker().setMinDate(calendar.getTimeInMillis());

【讨论】:

虽然您的代码 sn-p 可能会解决问题,但您应该描述您的代码的目的是什么(它如何解决问题)。此外,您可能需要检查***.com/help/how-to-answer【参考方案4】:

API 11 以上你可以使用的最小日期

android:minDate="mm/dd/yyyy"setMinDate(long time) 对于最大日期

android:maxDate="mm/dd/yyyy" // 在 XML 中

setMaxDate(new Date().getTime());// 当前时间

【讨论】:

我正在调用 setMinDate() 但它没有任何效果。【参考方案5】:

我使用该方法将最小日期设置为当前年份,即2020-05-20 像这样

datePickerDialog.getDatePicker().setMinDate(calendar.getTimeInMillis());

点击日期选择器的那一刻,它会显示 2020 年作为最小年份

希望答案对你有帮助。

【讨论】:

【参考方案6】:

在 XML 文件中

<DatePicker
android:minDate="mm/dd/yyyy"
android:maxDate="mm/dd/yyyy" >

例如:

android:minDate="10/12/2000"


android:maxDate="10/12/2000"

【讨论】:

【参考方案7】:
  mdate.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            final Calendar calendar = Calendar.getInstance();
            //set time zone
            calendar.setTimeZone(TimeZone.getTimeZone("UTC"));

            int selectedYear = calendar.get(Calendar.YEAR);
            int selectedMonth = calendar.get(Calendar.MONTH);
            int selectedDay = calendar.get(Calendar.DAY_OF_MONTH);
            DatePickerDialog datePickerDialog = new DatePickerDialog(BrandResturant_DetailActivity.this,
                    new DatePickerDialog.OnDateSetListener() 
                        public void onDateSet(DatePicker view, int selectedYear,
                                              int selectedMonth, int selectedDay) 
                            mDay = selectedDay;
                            mMonth = selectedMonth;
                            mYear = selectedYear;
                            StringBuilder Date = new StringBuilder("");
                            String conver = Integer.toString(selectedYear);
                            Date.append(conver);
                            Date.append("-");
                            selectedMonth++;
                            conver = Integer.toString(selectedMonth);
                            Date.append(conver);
                            Date.append("-");
                            conver = Integer.toString(selectedDay);
                            Date.append(conver);
                            isDob = true;
                        
                    , mDay, mMonth, mYear);

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


            
            //Getting Today date to calendar2
            final Calendar calendar2 = Calendar.getInstance();
            //Set Minimum date of calendar
            calendar2.set(2021, 1, 3);
            datePickerDialog.getDatePicker().setMinDate(calendar2.getTimeInMillis());
            datePickerDialog.setTitle("Select Date");
            datePickerDialog.show();


            //Getting Today date to calendar3
            final Calendar calendar3 = Calendar.getInstance();
            //Set Maximum date of calendar - Method 1
            calendar3.set(2021, 3, 3);
            //Set Maximum One Month date from today(calendar3) date to calendar -Method 2
            //In Place of month u can also set year, day
            //calendar3.add(Calendar.MONTH, 1);
            datePickerDialog.getDatePicker().setMaxDate(calendar3.getTimeInMillis());
            datePickerDialog.setTitle("Select Date");
            datePickerDialog.show();
        
    );

【讨论】:

请为您的代码提供解释。 @AshishSharma 您可以通过从 calendar2 获取日期来设置选择的最小日期,或者通过 calendar2.set(2021, 1, 3) 以编程方式设置最小日期并设置选择的最大日期通过以编程方式设置 calendar3.set(2021, 3, 3),或者您也可以通过指定月、日、年来设置月、日、年,例如。我正在为calender3 日期calender3.add(Calendar.MONTH, 1); 最多添加一个月的月份;

以上是关于Android DatePickerDialog:设置选择的最小和最大日期的主要内容,如果未能解决你的问题,请参考以下文章

对话框android中的datepickerdialog

android笔记:DatePickerDialog日期设置对话框

在 DatePickerDialog (Android) 上验证日期时出现 IllegalArgumentException

android DatePickerDialog怎么设置日期选择范围。

Android DatePickerDialog TimePickerDialog

如何在 DatePickerDialog Android 中禁用今天日期之前的日期?