我需要在我正在使用的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;
有关如何执行此操作的任何指示?
由于
答案 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);
}
}