[英]Android DatePickerDialog: Set min and max date for selection
[英]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.