2011-03-02 92 views
3

我需要设置DatePickerDialog上的最大年份,但我无法找到任何机制。该文档提到getDatePicker()作为DatePickerDialog的公共方法。所以,我想,也许,可以用来获取DatePicker,然后我可以设置最大日期,但是当我尝试获取DatePicker时,出现“Method undefined”错误。Android DatePickerDialog上的最大日期

这是我想如何让我的onCreateDialog中的DatePicker。

DatePickerDialog d = new DatePickerDialog(this, dep_dateListener, mYear, 
         mMonth, mDay); 
DatePicker dp = d.getDatePicker(); 
dp.setMaxDate(maxDate); 
return d; 

任何关于如何做到这一点的指针?

由于

回答

12

的getDatePicker()方法是在API级别可用11.

+1

这是问题。谢谢。 – Nishith 2011-03-11 10:55:51

+3

...所以'DatePicker#setMaxDate(...)' – Arjan 2012-06-03 13:17:19

+0

设置maxDate在api <11试试这个http://stackoverflow.com/a/32943731/3758898 – 2015-10-05 07:58:00

1

使DatePickerDialog的子类

倍率onDateChanged方法

看到source code

import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.Date; 
import android.app.DatePickerDialog; 
import android.content.Context; 
import android.widget.DatePicker; 

public class MyDatePickerDialog extends DatePickerDialog{ 
private final int minYear; 
private final int minMonth; 
private final int minDay; 

private int maxYear; 
private int maxMonth; 
private int maxDay; 

private final Calendar mCalendar; 
private final SimpleDateFormat formatter; 


public MyDatePickerDialog(Context context,OnDateSetListener callBack,int year,int monthOfYear,int dayOfMonth){ 
    super(context,callBack,year,monthOfYear,dayOfMonth); 

    mCalendar = Calendar.getInstance(); 

    //set up mindate 
    minYear=Constant.minYear; 
    minMonth=Constant.minMonth; 
    minDay=Constant.minDay; 

    mCalendar.setTime(new Date()); 
    //set up maxdate 
    mCalendar.add(Calendar.YEAR, Constant.maxBirthdayYearSinceNow); 
    maxYear=mCalendar.get(Calendar.YEAR); 
    maxMonth=mCalendar.get(Calendar.MONTH); 
    maxDay=mCalendar.get(Calendar.DATE); 

    //set up init date 
    mCalendar.set(Calendar.YEAR, year); 
    mCalendar.set(Calendar.MONTH, monthOfYear); 
    mCalendar.set(Calendar.DAY_OF_MONTH, dayOfMonth); 

    //set up date display format 
    formatter = new SimpleDateFormat("MM/dd/yyyy"); 
    setTitle(formatter.format(mCalendar.getTime())); 
} 

@Override 
public void onDateChanged(DatePicker view, int year,int month, int day){ 
    boolean beforeMinDate=false; 
    boolean afterMaxDate=false; 

    if(year<minYear){ 
     beforeMinDate=true; 
    } 
    else if(year==minYear){ 
     if(month<minMonth){ 
      beforeMinDate=true; 
     } 
     else if(month==minMonth){ 
      if(day<minDay){ 
       beforeMinDate=true; 
      } 
     } 
    } 

    if(!beforeMinDate){ 
     if(year>maxYear){ 
      afterMaxDate=true; 
     } 
     else if(year==maxYear){ 
      if(month>maxMonth){ 
       afterMaxDate=true; 
      } 
      else if(month==maxMonth){ 
       if(day>maxDay){ 
        afterMaxDate=true; 
       } 
      } 
     } 
    } 

    //need set invalid date to mindate or maxdate 
    if(beforeMinDate || afterMaxDate){ 
     if(beforeMinDate){ 
      year=minYear; 
      month=minMonth; 
      day=minDay; 
     } 
     else{ 
      year=maxYear; 
      month=maxMonth; 
      day=maxDay; 
     } 
     view.updateDate(year, month, day); 
    } 

    //display in view title 
    mCalendar.set(Calendar.YEAR, year); 
    mCalendar.set(Calendar.MONTH, month); 
    mCalendar.set(Calendar.DAY_OF_MONTH, day); 
    setTitle(formatter.format(mCalendar.getTime())); 
} 
} 
1

setMaxDate()仅适用于新的API,但如果您希望您的应用程序使用较早的版本,那么您必须为日期制作自己的比较器。

例如,我只使用Calendar.getInstance()并使用方法Date.before(Date)Date.after(Date)获取当地日期,您可以为DatePicker添加限制。

0

在MonoDroid的一个更好的实现:

public DateTime MaxDate { get; set; } 
public DateTime MinDate { get; set; } 

public override void OnDateChanged(DatePicker view, int year, int month, int day) 
    { 
     var error = false; 

     if (year < MinDate.Year) 
     { 
      error = true; 
      year++; 
     } 
     else if (year == MinDate.Year) 
     { 
      if (month < MinDate.Month - 1) 
      { 
       error = true; 
       month++; 
      } 
      else if (month == MinDate.Month - 1) 
      { 
       if (day < MinDate.Day) 
       { 
        error = true; 
        day++; 
       } 
      } 
     } 

     if (!error) 
     { 
      if (year > MaxDate.Year) 
      { 
       error = true; 
       year--; 
      } 
      else if (year == MaxDate.Year) 
      { 
       if (month > MaxDate.Month - 1) 
       { 
        error = true; 
        month--; 
       } 
       else if (month == MaxDate.Month - 1) 
       { 
        if (day > MaxDate.Day) 
        { 
         error = true; 
         day--; 
        } 
       } 
      } 
     } 

     if (error) 
     { 
      view.UpdateDate(year, month, day); 
     } 

    } 
相关问题