DatePickerpublic class DatePicker extends android.widget.FrameLayout A view for selecting a month / year / day based on a calendar like layout.
See the Date Picker
tutorial.
For a dialog using this view, see {@link android.app.DatePickerDialog}. |
Fields Summary |
---|
private static final int | DEFAULT_START_YEAR | private static final int | DEFAULT_END_YEAR | private final android.widget.CheckBox | mYearToggle | private final android.widget.NumberPicker | mDayPicker | private final android.widget.NumberPicker | mMonthPicker | private final android.widget.NumberPicker | mYearPicker | private OnDateChangedListener | mOnDateChangedListenerHow we notify users the date has changed. | private int | mDay | private int | mMonth | private int | mYear | private boolean | mYearOptional | private boolean | mHasYear |
Constructors Summary |
---|
public DatePicker(android.content.Context context)
this(context, null);
| public DatePicker(android.content.Context context, android.util.AttributeSet attrs)
this(context, attrs, 0);
| public DatePicker(android.content.Context context, android.util.AttributeSet attrs, int defStyle)
super(context, attrs, defStyle);
ContextThemeWrapper themed = new ContextThemeWrapper(context,
com.android.internal.R.style.Theme_Holo_Light_Dialog_Alert);
LayoutInflater inflater = (LayoutInflater) themed.getSystemService(
Context.LAYOUT_INFLATER_SERVICE);
inflater.inflate(R.layout.date_picker, this, true);
mDayPicker = (NumberPicker) findViewById(R.id.day);
mDayPicker.setFormatter(NumberPicker.getTwoDigitFormatter());
mDayPicker.setOnLongPressUpdateInterval(100);
mDayPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
mDay = newVal;
notifyDateChanged();
}
});
mMonthPicker = (NumberPicker) findViewById(R.id.month);
mMonthPicker.setFormatter(NumberPicker.getTwoDigitFormatter());
DateFormatSymbols dfs = new DateFormatSymbols();
String[] months = dfs.getShortMonths();
/*
* If the user is in a locale where the month names are numeric,
* use just the number instead of the "month" character for
* consistency with the other fields.
*/
if (months[0].startsWith("1")) {
for (int i = 0; i < months.length; i++) {
months[i] = String.valueOf(i + 1);
}
mMonthPicker.setMinValue(1);
mMonthPicker.setMaxValue(12);
} else {
mMonthPicker.setMinValue(1);
mMonthPicker.setMaxValue(12);
mMonthPicker.setDisplayedValues(months);
}
mMonthPicker.setOnLongPressUpdateInterval(200);
mMonthPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
public void onValueChange(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();
notifyDateChanged();
updateDaySpinner();
}
});
mYearPicker = (NumberPicker) findViewById(R.id.year);
mYearPicker.setOnLongPressUpdateInterval(100);
mYearPicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
mYear = newVal;
// Adjust max day for leap years if needed
adjustMaxDay();
notifyDateChanged();
updateDaySpinner();
}
});
mYearToggle = (CheckBox) findViewById(R.id.yearToggle);
mYearToggle.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
mHasYear = isChecked;
adjustMaxDay();
notifyDateChanged();
updateSpinners();
}
});
// attributes
TypedArray a = context.obtainStyledAttributes(attrs,
com.android.internal.R.styleable.DatePicker);
int mStartYear =
a.getInt(com.android.internal.R.styleable.DatePicker_startYear, DEFAULT_START_YEAR);
int mEndYear =
a.getInt(com.android.internal.R.styleable.DatePicker_endYear, DEFAULT_END_YEAR);
mYearPicker.setMinValue(mStartYear);
mYearPicker.setMaxValue(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);
}
|
Methods Summary |
---|
private void | adjustMaxDay()
Calendar cal = Calendar.getInstance();
// if year was not set, use 2000 as it was a leap year
cal.set(Calendar.YEAR, mHasYear ? mYear : 2000);
cal.set(Calendar.MONTH, mMonth);
int max = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
if (mDay > max) {
mDay = max;
}
| protected void | dispatchRestoreInstanceState(android.util.SparseArray container)Override so we are in complete control of save / restore for this widget.
dispatchThawSelfOnly(container);
| private static int | getCurrentYear()
return Calendar.getInstance().get(Calendar.YEAR);
| public int | getDayOfMonth()
return mDay;
| public int | getMonth()
return mMonth;
| public int | getYear()
return (mYearOptional && !mHasYear) ? 0 : mYear;
| public void | init(int year, int monthOfYear, int dayOfMonth, com.android.test.hwui.DatePicker$OnDateChangedListener onDateChangedListener)Initialize the state.
init(year, monthOfYear, dayOfMonth, false, onDateChangedListener);
| public void | init(int year, int monthOfYear, int dayOfMonth, boolean yearOptional, com.android.test.hwui.DatePicker$OnDateChangedListener onDateChangedListener)Initialize the state.
mYear = (yearOptional && year == 0) ? getCurrentYear() : year;
mMonth = monthOfYear;
mDay = dayOfMonth;
mYearOptional = yearOptional;
mHasYear = !yearOptional || (year != 0);
mOnDateChangedListener = onDateChangedListener;
updateSpinners();
| private void | notifyDateChanged()
if (mOnDateChangedListener != null) {
int year = (mYearOptional && !mHasYear) ? 0 : mYear;
mOnDateChangedListener.onDateChanged(DatePicker.this, year, mMonth, mDay);
}
| protected void | onRestoreInstanceState(android.os.Parcelable state)
SavedState ss = (SavedState) state;
super.onRestoreInstanceState(ss.getSuperState());
mYear = ss.getYear();
mMonth = ss.getMonth();
mDay = ss.getDay();
mHasYear = ss.hasYear();
mYearOptional = ss.isYearOptional();
updateSpinners();
| protected android.os.Parcelable | onSaveInstanceState()
Parcelable superState = super.onSaveInstanceState();
return new SavedState(superState, mYear, mMonth, mDay, mHasYear, mYearOptional);
| private void | reorderPickers(java.lang.String[] months)
java.text.DateFormat format;
String order;
/*
* If the user is in a locale where the medium date format is
* still numeric (Japanese and Czech, for example), respect
* the date format order setting. Otherwise, use the order
* that the locale says is appropriate for a spelled-out date.
*/
if (months[0].startsWith("1")) {
format = DateFormat.getDateFormat(getContext());
} else {
format = DateFormat.getMediumDateFormat(getContext());
}
if (format instanceof SimpleDateFormat) {
order = ((SimpleDateFormat) format).toPattern();
} else {
// Shouldn't happen, but just in case.
order = new String(DateFormat.getDateFormatOrder(getContext()));
}
/* Remove the 3 pickers from their parent and then add them back in the
* required order.
*/
LinearLayout parent = (LinearLayout) findViewById(R.id.parent);
parent.removeAllViews();
boolean quoted = false;
boolean didDay = false, didMonth = false, didYear = false;
for (int i = 0; i < order.length(); i++) {
char c = order.charAt(i);
if (c == '\'") {
quoted = !quoted;
}
if (!quoted) {
if (c == DateFormat.DATE && !didDay) {
parent.addView(mDayPicker);
didDay = true;
} else if ((c == DateFormat.MONTH || c == 'L") && !didMonth) {
parent.addView(mMonthPicker);
didMonth = true;
} else if (c == DateFormat.YEAR && !didYear) {
parent.addView (mYearPicker);
didYear = true;
}
}
}
// Shouldn't happen, but just in case.
if (!didMonth) {
parent.addView(mMonthPicker);
}
if (!didDay) {
parent.addView(mDayPicker);
}
if (!didYear) {
parent.addView(mYearPicker);
}
| public void | setEnabled(boolean enabled)
super.setEnabled(enabled);
mDayPicker.setEnabled(enabled);
mMonthPicker.setEnabled(enabled);
mYearPicker.setEnabled(enabled);
| public void | updateDate(int year, int monthOfYear, int dayOfMonth)
if (mYear != year || mMonth != monthOfYear || mDay != dayOfMonth) {
mYear = (mYearOptional && year == 0) ? getCurrentYear() : year;
mMonth = monthOfYear;
mDay = dayOfMonth;
updateSpinners();
reorderPickers(new DateFormatSymbols().getShortMonths());
notifyDateChanged();
}
| private void | updateDaySpinner()
Calendar cal = Calendar.getInstance();
// if year was not set, use 2000 as it was a leap year
cal.set(mHasYear ? mYear : 2000, mMonth, 1);
int max = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
mDayPicker.setMinValue(1);
mDayPicker.setMaxValue(max);
mDayPicker.setValue(mDay);
| private void | updateSpinners()
updateDaySpinner();
mYearToggle.setChecked(mHasYear);
mYearToggle.setVisibility(mYearOptional ? View.VISIBLE : View.GONE);
mYearPicker.setValue(mYear);
mYearPicker.setVisibility(mHasYear ? View.VISIBLE : View.GONE);
/* The month display uses 1-12 but our internal state stores it
* 0-11 so add one when setting the display.
*/
mMonthPicker.setValue(mMonth + 1);
|
|