【问题标题】:prevent selecting past dates in timePicker DialogFragment防止在 timePicker DialogFragment 中选择过去的日期
【发布时间】:2013-08-19 20:45:07
【问题描述】:

我在编辑文本上应用以下代码来选择日期。

public class DatePickerFragment extends DialogFragment
{

    private OnDateSetListener listener;

    public DatePickerFragment(OnDateSetListener listener)
    {
        this.listener = listener;
    }

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState)
    {
        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);

        return new DatePickerDialog(getActivity(), listener, year, month, day);
    }
}

@Override
public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth)
{
    //do some stuff
}

void showDateDialog()
{
    DatePickerFragment newFragment = new DatePickerFragment(this);
    newFragment.show(getFragmentManager(), "date_picker");
}

但是,我想将所有过去的日期显示为灰色,这样用户就不能选择其中任何一个。这可以通过代码实现吗?或者我应该在选择后手动检查日期是否为过去日期?

【问题讨论】:

    标签: android datepicker android-dialogfragment android-datepicker


    【解决方案1】:

    使用setMinDate() 函数。它在getDefault() 时区设置自 1970 年 1 月 1 日 00:00:00 以来的最小日期(以毫秒为单位)。将最小日期设置为今天的日期,这样用户将无法超过它。类似于onCreateDialog 中的内容:

    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);
    
    DatePickerDialog d = new DatePickerDialog(getActivity(), listener, year, month, day);  
    DatePicker dp = d.getDatePicker(); 
    dp.setMinDate(c.getTimeInMillis());
    return d;
    

    【讨论】:

    • 在将近半年之后,是的,这是最好的答案!我不知道为什么它仍然没有被赞成。
    • 我不认为该解决方案适用于片段,我可能错了。
    • 在 Dialog Fragment 的情况下如何处理?
    • 有没有办法对TimePickerDialog做同样的事情?
    【解决方案2】:
    date button on clcik method 
    
       dateButton.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    showDialog(DATE_DIALOG_ID);
    
    
                }
            });
    
    
    for date piker create dialog method :
    
    case DATE_DIALOG_ID:
                {
    
                    Calendar calendar = Calendar.getInstance();
                    final DatePickerDialog dojDPDilog = new DatePickerDialog(this,datePickerListener,calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH), calendar.get(Calendar.DATE));
                         dojDPDilog.setTitle("Select Date");
                    try {
                        java.lang.reflect.Field mDatePickerField = dojDPDilog.getClass().getDeclaredField("mDatePicker");
                        mDatePickerField.setAccessible(true);
                        try {
                            dojDPicker = (DatePicker) mDatePickerField.get(dojDPDilog);
                        } catch (IllegalArgumentException e) {
                            e.printStackTrace();
                        } catch (IllegalAccessException e) {
                            e.printStackTrace();
                        }
                    } catch (NoSuchFieldException e) {
                        e.printStackTrace();
                    }
    
                    dojDPicker.init(minYear, minMonth, minDay,new OnDateChangedListener() {
                                @Override
                                public void onDateChanged(DatePicker view, int year,int monthOfYear, int dayOfMonth) {
                                  disableDate(view, year, monthOfYear, dayOfMonth);
                                  }
    
    
                            });
                    return dojDPDilog;
                }  
    
    
    for disable method:
    
    
          private void disableDate(DatePicker view, int year,int monthOfYear, int dayOfMonth) {
    
                if (year > maxYear)
                {
                    view.updateDate(maxYear, maxMonth, maxDay);
                }
                else if (monthOfYear > maxMonth && year == maxYear)
                {
                    view.updateDate(maxYear, maxMonth, maxDay);
                }
            else if (dayOfMonth > maxDay && year == maxYear && monthOfYear == maxMonth)
                {
                    view.updateDate(maxYear, maxMonth, maxDay);
                }
                else if (year < minYear)
                {
                    view.updateDate(minYear, monthOfYear, dayOfMonth);
                }
                else if (monthOfYear < minMonth && year == minYear)
                {
                    view.updateDate(minYear, minMonth, dayOfMonth);
                }
            else if (dayOfMonth < minDay && year == minYear && monthOfYear == minMonth)
                {
                    view.updateDate(minYear, minMonth, minDay);
                }
            }
    
    
    
               and take local variables:
    
             int maxYear = c.get(Calendar.YEAR) + 100; 
        int maxMonth = c.get(Calendar.MONTH);
        int maxDay = c.get(Calendar.DAY_OF_MONTH);
    
        int minYear = c.get(Calendar.YEAR);
        int minMonth = c.get(Calendar.MONTH);
        int minDay = c.get(Calendar.DAY_OF_MONTH);
    

    【讨论】:

      【解决方案3】:

      使用DatePicker.setMaxDate()DatePicker.setMinDate() 设置固定年份。

      例如。

      Calendar c_max = Calendar.getInstance(),
      Calendar c_min = Calendar.getInstance();
      
      c_min.set(2012,0,1);  // your min date boundary
      c_max.set(2013,11,31); // your max date boundary
      
      DatePicker.setMaxDate(c_max.getTimeInMillis());
      DatePicker.setMinDate(c_min.getTimeInMillis());
      

      由于 setMaxDate()setMinDate() 是从 API 11 添加的,因此对于较低版本,您可以按以下方式进行。

      您可以使用 init datePicker 方法设置范围。

      // Calendar
      this.calendar = new GregorianCalendar();
      this.datePicker = (DatePicker) findViewById(R.id.your_datepicker_id);
      
      // check for the build version
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
          // (picker is a DatePicker- set current time as min time.
          this.datePicker.setMinDate(this.calendar.getTimeInMillis());
      } else {
          final int minYear = this.calendar.get(Calendar.YEAR);
          final int minMonth = this.calendar.get(Calendar.MONTH);
          final int minDay = this.calendar.get(Calendar.DAY_OF_MONTH);
      
          this.datePicker.init(minYear, minMonth, minDay,
                  new OnDateChangedListener() {
      
                      public void onDateChanged(DatePicker view, int year,
                              int month, int day) {
                          Calendar newDate = Calendar.getInstance();
                          newDate.set(year, month, day);
      
                          if (calendar.after(newDate)) {
                              view.init(minYear, minMonth, minDay, this);
                          }
                      }
                  });    
      }
      

      【讨论】:

      • 你不能调用 DatePicker datePicker = datePickerDialog.getDatePicker();对于 api
      【解决方案4】:

      在 onDateSet() 方法中试试这个。这适用于片段。

      Calendar calendar1 = Calendar.getInstance();
      calendar1.set(2014,11-1,11);
      view.setMinDate(calendar1.getTimeInMillis()-10000);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-02-19
        • 1970-01-01
        • 2021-09-10
        • 2010-12-19
        • 2017-05-01
        • 1970-01-01
        • 2021-04-15
        相关资源
        最近更新 更多