【问题标题】:Max Date on an Android DatePickerDialogAndroid DatePickerDialog 上的最大日期
【发布时间】:2011-03-02 04:39:38
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: android android-datepicker


    【解决方案1】:

    getDatePicker() 方法在 API 级别 11 中可用。

    【讨论】:

    • 这就是问题所在。谢谢。
    • ...DatePicker#setMaxDate(...)
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2016-01-08
          • 1970-01-01
          • 2023-03-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-17
          • 1970-01-01
          相关资源
          最近更新 更多