2222import android .os .Parcel ;
2323import android .os .Parcelable ;
2424import android .text .format .DateFormat ;
25+ import android .text .format .DateUtils ;
2526import android .util .AttributeSet ;
2627import android .util .SparseArray ;
2728import android .view .LayoutInflater ;
3334import java .text .DateFormatSymbols ;
3435import java .text .SimpleDateFormat ;
3536import java .util .Calendar ;
37+ import java .util .Locale ;
3638
3739/**
3840 * A view for selecting a month / year / day based on a calendar like layout.
@@ -47,7 +49,10 @@ public class DatePicker extends FrameLayout {
4749
4850 private static final int DEFAULT_START_YEAR = 1900 ;
4951 private static final int DEFAULT_END_YEAR = 2100 ;
50-
52+
53+ // This ignores Undecimber, but we only support real Gregorian calendars.
54+ private static final int NUMBER_OF_MONTHS = 12 ;
55+
5156 /* UI Components */
5257 private final NumberPicker mDayPicker ;
5358 private final NumberPicker mMonthPicker ;
@@ -62,6 +67,10 @@ public class DatePicker extends FrameLayout {
6267 private int mMonth ;
6368 private int mYear ;
6469
70+ private Object mMonthUpdateLock = new Object ();
71+ private volatile Locale mMonthLocale ;
72+ private String [] mShortMonths ;
73+
6574 /**
6675 * The callback used to indicate the user changes the date.
6776 */
@@ -102,8 +111,7 @@ public void onChanged(NumberPicker picker, int oldVal, int newVal) {
102111 });
103112 mMonthPicker = (NumberPicker ) findViewById (R .id .month );
104113 mMonthPicker .setFormatter (NumberPicker .TWO_DIGIT_FORMATTER );
105- DateFormatSymbols dfs = new DateFormatSymbols ();
106- String [] months = dfs .getShortMonths ();
114+ final String [] months = getShortMonths ();
107115
108116 /*
109117 * If the user is in a locale where the month names are numeric,
@@ -114,9 +122,9 @@ public void onChanged(NumberPicker picker, int oldVal, int newVal) {
114122 for (int i = 0 ; i < months .length ; i ++) {
115123 months [i ] = String .valueOf (i + 1 );
116124 }
117- mMonthPicker .setRange (1 , 12 );
125+ mMonthPicker .setRange (1 , NUMBER_OF_MONTHS );
118126 } else {
119- mMonthPicker .setRange (1 , 12 , months );
127+ mMonthPicker .setRange (1 , NUMBER_OF_MONTHS , months );
120128 }
121129
122130 mMonthPicker .setSpeed (200 );
@@ -246,11 +254,30 @@ public void updateDate(int year, int monthOfYear, int dayOfMonth) {
246254 mMonth = monthOfYear ;
247255 mDay = dayOfMonth ;
248256 updateSpinners ();
249- reorderPickers (new DateFormatSymbols (). getShortMonths ());
257+ reorderPickers (getShortMonths ());
250258 notifyDateChanged ();
251259 }
252260 }
253261
262+ private String [] getShortMonths () {
263+ final Locale currentLocale = Locale .getDefault ();
264+ if (currentLocale .equals (mMonthLocale ) && mShortMonths != null ) {
265+ return mShortMonths ;
266+ } else {
267+ synchronized (mMonthUpdateLock ) {
268+ if (!currentLocale .equals (mMonthLocale )) {
269+ mShortMonths = new String [NUMBER_OF_MONTHS ];
270+ for (int i = 0 ; i < NUMBER_OF_MONTHS ; i ++) {
271+ mShortMonths [i ] = DateUtils .getMonthString (Calendar .JANUARY + i ,
272+ DateUtils .LENGTH_MEDIUM );
273+ }
274+ mMonthLocale = currentLocale ;
275+ }
276+ }
277+ return mShortMonths ;
278+ }
279+ }
280+
254281 private static class SavedState extends BaseSavedState {
255282
256283 private final int mYear ;
0 commit comments