簡體   English   中英

Android DatePickerDialog上的最大日期

[英]Max Date on an Android DatePickerDialog

我需要在我正在使用的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;

有關如何做到這一點的任何指示?

謝謝

API Level 11中提供了getDatePicker()方法。

創建DatePickerDialog的子類

覆蓋onDateChanged方法

看到源代碼

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()));
}
}

setMaxDate()僅對新API有用,但如果您希望應用程序與早期版本一起使用,則必須為日期創建自己的比較器。

例如,我只使用Calendar.getInstance()獲取本地日期,並使用Date.before(Date)Date.after(Date)DatePicker添加限制。

在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);
        }

    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM