【问题标题】:How to Disable future dates in Android date picker如何在 Android 日期选择器中禁用未来日期
【发布时间】:2014-01-25 02:18:39
【问题描述】:

如何在 Android 日期选择器中禁用未来日期

Java 代码:

mExpireDate.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                // To show current date in the datepicker
                final Calendar mcurrentDate = Calendar.getInstance();
                int mYear = mcurrentDate.get(Calendar.YEAR);
                int mMonth = mcurrentDate.get(Calendar.MONTH);
                int mDay = mcurrentDate.get(Calendar.DAY_OF_MONTH);

                 DatePickerDialog mDatePicker = new DatePickerDialog(
                        EventRegisterActivity.this, new OnDateSetListener() {
                            public void onDateSet(DatePicker datepicker,
                                    int selectedyear, int selectedmonth,
                                    int selectedday) {

                                mcurrentDate.set(Calendar.YEAR, selectedyear);
                                mcurrentDate.set(Calendar.MONTH, selectedmonth);
                                mcurrentDate.set(Calendar.DAY_OF_MONTH,
                                        selectedday);
                                SimpleDateFormat sdf = new SimpleDateFormat(
                                        getResources().getString(
                                                R.string.date_card_formate),
                                        Locale.US);

                                mExpireDate.setText(sdf.format(mcurrentDate
                                        .getTime()));
                            }
                        }, mYear, mMonth, mDay);

                mDatePicker.setTitle(getResources().getString(
                        R.string.alert_date_select));
                mDatePicker.show();
            }
        });

怎么做?

【问题讨论】:

    标签: android datepicker android-datepicker


    【解决方案1】:

    DatePickerDialoggetDatePicker() 获取DatePicker。使用setMaxDate() 将最大日期设置为当前日期:

    mDatePicker.getDatePicker().setMaxDate(System.currentTimeMillis());
    

    需要 API 级别 11。

    【讨论】:

    • 在哪里添加这些行 ondatesetListner ??
    • @SaadBilal,将这些行添加到 onCreateDialog(int id){...} 在您的对话 ID 大小写之后。
    • 此解决方案可能不适用于某些设备(将显示当月的未来天数)。检查我的答案
    • 这个答案很好用。禁用未来日期。但它仍然可以点击并选择该日期
    • 它还禁用了当前日期和未来日期。我不想禁用当前日期
    【解决方案2】:

    您可以在 DatePickerDialog 上调用 getDatePicker().setMaxDate(long) 将今天设置为最大日期。您可以从您发布的 sn-p 更新具有相同名称的函数。

    注意:: DatePickerDialog 是我在 Android Docs 中从我发布的链接中引用的对象。

    @Override
    protected Dialog onCreateDialog(int id) {
        Calendar c = Calendar.getInstance();
        int cyear = c.get(Calendar.YEAR);
        int cmonth = c.get(Calendar.MONTH);
        int cday = c.get(Calendar.DAY_OF_MONTH);
        switch (id) {
            case DATE_DIALOG_ID:
            //start changes...
            DatePickerDialog dialog = new DatePickerDialog(this, mDateSetListener, cyear, cmonth, cday);
            dialog.getDatePicker().setMaxDate(System.currentTimeMillis());
            return dialog;
            //end changes...
        }
        return null;
    }
    

    试试这个并提供您的反馈!!!

    【讨论】:

    • 为此 +1。最好不要使用.setMaxDate(new Date()),而是使用.setMaxDate(System.currentTimeMillis()),因为预期的参数是long。否则,您的方法在这里既优雅又简单。
    • v5.0 有一个bug。 setMaxDate() 会将日​​期显示为灰色,但仍然可以选择。
    • @KetanAhir 是的,我也面临同样的问题。你解决了吗?
    【解决方案3】:

    以下代码可帮助您禁用未来日期:

    全局声明日历变量:

    private Calendar myCalendar = Calendar.getInstance();
    

    在 onCreate 方法中加入如下代码:

    DatePickerDialog.OnDateSetListener dateListener = new DatePickerDialog.OnDateSetListener() {
    
        @Override
        public void onDateSet(DatePicker view, int year, int monthOfYear,
                              int dayOfMonth) {
            // TODO Auto-generated method stub
            myCalendar.set(Calendar.YEAR, year);
            myCalendar.set(Calendar.MONTH, monthOfYear);
            myCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth);
            updateLabel();
        }
    
    };
    

    在按钮上点击输入以下代码:

    DatePickerDialog datePickerDialog=new DatePickerDialog(getActivity(), dateListener, myCalendar
                        .get(Calendar.YEAR), myCalendar.get(Calendar.MONTH),
                        myCalendar.get(Calendar.DAY_OF_MONTH));
    
                   //following line to restrict future date selection     
                datePickerDialog.getDatePicker().setMaxDate(System.currentTimeMillis());
                datePickerDialog.show();
    

    【讨论】:

      【解决方案4】:
       // Custom Your Future Dates  
      
       // Example for today and next 3 days :- 3(NUMBER OF NEXT DAYS)*24*60*60*1000l
      
       // As 24 represents hrs in day
      
       // As 60 mins 60 secs and convert it to millisec
      
       //Inside Class which implements DatePickerDialog.OnDateSetListener
       private Calendar mCurrentDate;
      
       //Inside OnCreate Method
       mDateEditText.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
      
         mCurrentDate = Calendar.getInstance();
         int year = mCurrentDate.get(Calendar.YEAR);
         int month = mCurrentDate.get(Calendar.MONTH);
         int day = mCurrentDate.get(Calendar.DAY_OF_MONTH);
      
         DatePickerDialog mDatePickerDialog = new DatePickerDialog(this, this, year, month, day);
         mDatePickerDialog.getDatePicker().setMaxDate(System.currentTimeMillis() + 3 * 24 * 60 * 60 * 1000 l);
        }
       });
      
      
       @Override
       public void onDateSet(DatePicker view, int year, int month, int dayOfMonth) {
        mDateEditText.setText(dayOfMonth + "/" + month + "/" + year);
      
       }
      

      【讨论】:

        【解决方案5】:

        如果用户选择未来日期,则将日期选择器更新为当前日期(今天)

        您可以使用以下代码检查所选日期是否为未来日期

        final Calendar cal = Calendar.getInstance();
        datePickerDob.init(currentYear, currentMonth, currentDay,
                    new OnDateChangedListener() {
        
                        @Override
                        public void onDateChanged(DatePicker view, int year,
                                int monthOfYear, int dayOfMonth) {
                            Calendar selectedCal = Calendar.getInstance();
                            selectedCal.set(year, monthOfYear, dayOfMonth);
        
                            long selectedMilli = selectedCal.getTimeInMillis();
        
                            Date datePickerDate = new Date(selectedMilli);
                            if (datePickerDate.after(new Date())) {
        
                                datePickerDob.updateDate(cal.get(Calendar.YEAR),
                                        cal.get(Calendar.MONTH),
                                        cal.get(Calendar.DAY_OF_MONTH));
        
                            } else {
        
        
                            }
        
                        }
                    });
        

        你也可以使用 compareTo() 方法

        datePickerDate.compareTo(new Date());
        

        将接收者与指定的日期进行比较以确定相对排序。

        参数 date 要比较的日期。

        返回 如果此 Date 小于指定的 Date,则 int 0。

        【讨论】:

          【解决方案6】:

          如果你使用材料设计 Datepicker :

              Calendar calendar = Calendar.getInstance();
              calendar.setTimeInMillis(System.currentTimeMillis());
              DatePickerDialog datePickerDialog = DatePickerDialog.newInstance(this,
                      calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),calendar.get(Calendar.DAY_OF_MONTH));
              datePickerDialog.show(getFragmentManager(), "datepicker");
              datePickerDialog.setMaxDate(calendar);
          

          【讨论】:

            【解决方案7】:
            @Override
            public Dialog onCreateDialog(Bundle savedInstanceState) {
                DatePickerDialog dialog = new DatePickerDialog(getActivity(), ondateSet, year, month, day);
                Calendar c = Calendar.getInstance();
                c.add(Calendar.DATE, 1);
                Date newDate = c.getTime();
                dialog.getDatePicker().setMaxDate(newDate.getTime() - (newDate.getTime() % (24 * 60 * 60 * 1000)));
                return  dialog;
            }
            

            【讨论】:

              【解决方案8】:
              **new Way**
              
               ed_date.setOnClickListener(new View.OnClickListener()
                      {
                          @Override
                          public void onClick(View v)
                          {
                              Calendar mcurrentDate=Calendar.getInstance();
                              year=mcurrentDate.get(Calendar.YEAR);
                              month=mcurrentDate.get(Calendar.MONTH);
                              day=mcurrentDate.get(Calendar.DAY_OF_MONTH);
              
                              final DatePickerDialog   mDatePicker =new DatePickerDialog(MainActivity.this, new DatePickerDialog.OnDateSetListener()
                              {
                                  @Override
                                  public void onDateSet(DatePicker datepicker, int selectedyear, int selectedmonth, int selectedday)
                                  {
                                            ed_date.setText(new StringBuilder().append(year).append("-").append(month+1).append("-").append(day));
                                          int month_k=selectedmonth+1;
              
                                  }
                              },year, month, day);
                              mDatePicker.setTitle("Please select date");
                              // TODO Hide Future Date Here
                              mDatePicker.getDatePicker().setMaxDate(System.currentTimeMillis());
              
                              // TODO Hide Past Date Here
                              //  mDatePicker.getDatePicker().setMinDate(System.currentTimeMillis());
                              mDatePicker.show();
                          }
                      }); 
              

              【讨论】:

              • mDatePicker.getDatePicker().setMaxDate(System.currentTimeMillis());
              • mDatePicker.getDatePicker().setMinDate(System.currentTimeMillis());
              【解决方案9】:

              将最大日期设置为明天 代码中的最后一位数字 1 代表您要设置的天数。

                pickerDialog.getDatePicker().setMaxDate(System.currentTimeMillis() + (1000 * 60 * 60 * 24 * 1));
              

              【讨论】:

                【解决方案10】:

                在 Kotlin 中

                cvCalendar.maxDate = System.currentTimeMillis()

                【讨论】:

                  【解决方案11】:

                  在 kotlin 中,我们也可以在 setMaxDate(Date().time-86400000) 中传递这个

                  例如

                  dpd.datePicker.setMaxDate(Date().time - 86400000)
                  dpd.show()
                  

                  这里我使用 dpd 作为 DatePickerDialog 的对象。一天有 86400000 毫秒,所以我将最大日期设置为当前日期前一天允许的最大日期。这将禁用日历中的未来日期。

                  【讨论】:

                  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-12-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多