Android DatePickerDialog上的最大日期

时间:2011-03-02 04:39:38

标签: android android-datepicker

我需要在我正在使用的DatePickerDialog上设置最大年份,但我无法找到任何这样做的机制。该文档提到getDatePicker()作为DatePickerDialog的公共方法。所以,我想,也许,可以用来获取DatePicker然后我可以设置最大日期,但我得到"方法未定义"我尝试获取DatePicker时出错。

这就是我试图在我的onCreateDialog中获取DatePicker的方法。

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

有关如何执行此操作的任何指示?

由于

4 个答案:

答案 0 :(得分:12)

getStatePicker()方法在API Level 11中可用。

答案 1 :(得分: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()));
}
}

答案 2 :(得分:1)

setMaxDate()仅对新API有用,但如果您希望应用程序与早期版本一起使用,则必须为日期制作自己的比较器。

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

答案 3 :(得分: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);
        }

    }