请大侠指导。
DatePickerDialog中如何设置起始年和结束年。
目前DatePickerDialog中默认起始年为1900,结束年为2100。

解决方案 »

  1.   

    就是说监听void  onDateChanged(DatePicker view, int year, int month, int day)
    然后如果超出范围就
    void  updateDate(int year, int monthOfYear, int dayOfMonth)
    重新更新。
      

  2.   

    private static final int DEFAULT_START_YEAR = 1900;
        private static final int DEFAULT_END_YEAR = 2100;
        
        /* UI Components */
        private final NumberPicker mDayPicker;
        private final NumberPicker mMonthPicker;
        private final NumberPicker mYearPicker;    /**
         * How we notify users the date has changed.
         */
        private OnDateChangedListener mOnDateChangedListener;
        
        private int mDay;
        private int mMonth;
        private int mYear;    /**
         * The callback used to indicate the user changes the date.
         */
        public interface OnDateChangedListener {        /**
             * @param view The view associated with this listener.
             * @param year The year that was set.
             * @param monthOfYear The month that was set (0-11) for compatibility
             *  with {@link java.util.Calendar}.
             * @param dayOfMonth The day of the month that was set.
             */
            void onDateChanged(DatePicker view, int year, int monthOfYear, int dayOfMonth);
        }    public DatePicker(Context context) {
            this(context, null);
        }
        
        public DatePicker(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }    public DatePicker(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            inflater.inflate(R.layout.date_picker, this, true);        mDayPicker = (NumberPicker) findViewById(R.id.day);
            mDayPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
            mDayPicker.setSpeed(100);
            mDayPicker.setOnChangeListener(new OnChangedListener() {
                public void onChanged(NumberPicker picker, int oldVal, int newVal) {
                    mDay = newVal;
                    if (mOnDateChangedListener != null) {
                        mOnDateChangedListener.onDateChanged(DatePicker.this, mYear, mMonth, mDay);
                    }
                }
            });
            mMonthPicker = (NumberPicker) findViewById(R.id.month);
            mMonthPicker.setFormatter(NumberPicker.TWO_DIGIT_FORMATTER);
            DateFormatSymbols dfs = new DateFormatSymbols();
            String[] months = dfs.getShortMonths();
            mMonthPicker.setRange(1, 12, months);
            mMonthPicker.setSpeed(200);
            mMonthPicker.setOnChangeListener(new OnChangedListener() {
                public void onChanged(NumberPicker picker, int oldVal, int newVal) {
                    
                    /* We display the month 1-12 but store it 0-11 so always
                     * subtract by one to ensure our internal state is always 0-11
                     */
                    mMonth = newVal - 1;
                    // Adjust max day of the month
                    adjustMaxDay();
                    if (mOnDateChangedListener != null) {
                        mOnDateChangedListener.onDateChanged(DatePicker.this, mYear, mMonth, mDay);
                    }
                    updateDaySpinner();
                }
            });
            mYearPicker = (NumberPicker) findViewById(R.id.year);
            mYearPicker.setSpeed(100);
            mYearPicker.setOnChangeListener(new OnChangedListener() {
                public void onChanged(NumberPicker picker, int oldVal, int newVal) {
                    mYear = newVal;
                    // Adjust max day for leap years if needed
                    adjustMaxDay();
                    if (mOnDateChangedListener != null) {
                        mOnDateChangedListener.onDateChanged(DatePicker.this, mYear, mMonth, mDay);
                    }
                    updateDaySpinner();
                }
            });
            
            // attributes
            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.DatePicker);        int mStartYear = a.getInt(R.styleable.DatePicker_startYear, DEFAULT_START_YEAR);
            int mEndYear = a.getInt(R.styleable.DatePicker_endYear, DEFAULT_END_YEAR);
            mYearPicker.setRange(mStartYear, mEndYear);
            
            a.recycle();
            
            // initialize to current date
            Calendar cal = Calendar.getInstance();
            init(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), null);
            
            // re-order the number pickers to match the current date format
            reorderPickers(months);
            
            if (!isEnabled()) {
                setEnabled(false);
            }
        }
      

  3.   

    楼上这些人的回答完全是想当然,根本就不懂你说的问题是什么http://code.google.com/p/android/issues/detail?id=5516貌似有你想要的答案For the DatePickerDialog, you can add the following lines to your theme : <item name="android:endYear">3000</item>
    <item name="android:startYear">1000</item>不过上述方法我试验了好像没实现,你如果实现了烦请转告
      

  4.   

    哈 这个问题 也纠结了我大半天,不过最终解决了,把代码贴上以供大家参考。 public static class MyDatePickerDialog extends DatePickerDialog {
    private int maxYear = 2100;
    private int minYear = 1900;
    private int currYear;
    private int currMonthOfYear;
    private int currDayOfMonth;

    public MyDatePickerDialog(Context context, OnDateSetListener callBack,
    int year, int monthOfYear, int dayOfMonth) {
    super(context, callBack, year, monthOfYear, dayOfMonth);
    currYear = year;
    currMonthOfYear = monthOfYear;
    currDayOfMonth = dayOfMonth;
    updateTitle(year, monthOfYear, dayOfMonth);
    } @Override
    public void onDateChanged(DatePicker view, int year, int month, int day) {
    if(year >= minYear && year <= maxYear){
    updateTitle(year, month, day);
    currYear = year;
    currMonthOfYear = month;
    currDayOfMonth = day;
    } else {
    updateDate(currYear, currMonthOfYear, currDayOfMonth);
    }
    }

    private void updateTitle(int year, int month, int day) {
    String title = String.format(
    this.getContext().getString(R.string.str_yy_birth_format),
    year, month + 1, day);
    setTitle(title);
    }

    public void setMaxYear(int year){
    maxYear = year;
    }

    public void setMinYear(int year){
    minYear = year;
    }
    }
      

  5.   

    这个问题的关键是在onDateChanged方法里, 先判断是否超出设定范围,如果超出范围则调用updateDate方法,把原来的数据设定回去(需要设定变量把year month day记录下来)。