就是说监听void onDateChanged(DatePicker view, int year, int month, int day) 然后如果超出范围就 void updateDate(int year, int monthOfYear, int dayOfMonth) 重新更新。
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); } }
楼上这些人的回答完全是想当然,根本就不懂你说的问题是什么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>不过上述方法我试验了好像没实现,你如果实现了烦请转告
哈 这个问题 也纠结了我大半天,不过最终解决了,把代码贴上以供大家参考。 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; } }
然后如果超出范围就
void updateDate(int year, int monthOfYear, int dayOfMonth)
重新更新。
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);
}
}
<item name="android:startYear">1000</item>不过上述方法我试验了好像没实现,你如果实现了烦请转告
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;
}
}