OSDN Git Service

Fix DatePicker's spinner order in various locales.
authorElliott Hughes <enh@google.com>
Tue, 30 Apr 2013 18:11:53 +0000 (11:11 -0700)
committerElliott Hughes <enh@google.com>
Tue, 30 Apr 2013 18:11:53 +0000 (11:11 -0700)
DatePicker always effectively uses yyyy MMM dd, so we need to ask
icu4c what order those should appear in for the user's locale. The
existing DateFormat code was an approximation that worked for en_US
but not for all languages (fa being one example).

Bug: 7207103
Change-Id: I7b12568dbc02522ebad6e1db5f8426109cd6f7ce

core/java/android/widget/DatePicker.java

index 07d3a7a..d4fd98f 100644 (file)
@@ -45,6 +45,8 @@ import java.util.Calendar;
 import java.util.Locale;
 import java.util.TimeZone;
 
+import libcore.icu.ICU;
+
 /**
  * This class is a widget for selecting a date. The date can be selected by a
  * year, month, and day spinners or a {@link CalendarView}. The set of spinners
@@ -508,24 +510,27 @@ public class DatePicker extends FrameLayout {
      */
     private void reorderSpinners() {
         mSpinners.removeAllViews();
-        char[] order = DateFormat.getDateFormatOrder(getContext());
+        // We use numeric spinners for year and day, but textual months. Ask icu4c what
+        // order the user's locale uses for that combination. http://b/7207103.
+        String pattern = ICU.getBestDateTimePattern("yyyyMMMdd", Locale.getDefault().toString());
+        char[] order = ICU.getDateFormatOrder(pattern);
         final int spinnerCount = order.length;
         for (int i = 0; i < spinnerCount; i++) {
             switch (order[i]) {
-                case DateFormat.DATE:
+                case 'd':
                     mSpinners.addView(mDaySpinner);
                     setImeOptions(mDaySpinner, spinnerCount, i);
                     break;
-                case DateFormat.MONTH:
+                case 'M':
                     mSpinners.addView(mMonthSpinner);
                     setImeOptions(mMonthSpinner, spinnerCount, i);
                     break;
-                case DateFormat.YEAR:
+                case 'y':
                     mSpinners.addView(mYearSpinner);
                     setImeOptions(mYearSpinner, spinnerCount, i);
                     break;
                 default:
-                    throw new IllegalArgumentException();
+                    throw new IllegalArgumentException(Arrays.toString(order));
             }
         }
     }