2014-01-21 1 views
11

Есть ли способ иметь отображения даты в DatePickerDialog на французскомУстановка языка на французский в андроид DatePickerDialog

Я искал об этом, но нашли никаких результатов

Вот мой код:

Calendar c = Calendar.getInstance(); 

picker = new DatePickerDialog(PaymentView.this, 
           PaymentView.this, 
        c.get(Calendar.YEAR), 
           c.get(Calendar.MONTH), 
        c.get(Calendar.DAY_OF_MONTH)); 

picker.setIcon(R.drawable.ic_launcher); 
picker.setTitle("Choisir la date"); 
picker.getDatePicker().setMinDate(System.currentTimeMillis() - 2000); 

Вместо пт, 21 ноября 2014 г. Я хочу иметь французскую аббревиатуру Я также добавил, что до ее создания:

+0

Можете ли вы дать мне французскую аббревиатуру этого примера, о котором вы упомянули? – Tobrun

+0

Я точно не знаю, но может быть «Ven 21 Nov 2014» – begiPass

+2

DatePicker использует настройки языка по умолчанию для телефона. Зачем вам это менять? Если телефон настроен на французский, формат будет во французском формате. – Nfear

ответ

2

Соответствующие классы:

http://developer.android.com/reference/android/app/DatePickerDialog.html http://developer.android.com/reference/android/widget/DatePicker.html http://developer.android.com/reference/android/widget/CalendarView.html

В настоящее время я не вижу никакой возможности использовать стандартный один с использованием вариантов локализации или повторного использования timepickerdialog и Datepicker реализации реализовать свой собственный calenderview (вы можете получить calenderview, но вы не можете установить календаря). Вы всегда можете реализовать свой собственный диалог.

Также я нашел эту библиотеку с открытым исходным кодом на web.

Он указывает, что он будет обрабатывать локальные настройки. Не пробовал, хотя.

+0

спасибо, я проверил его сейчас – begiPass

5

я была почти аналогичная проблема, и я нашел решение для этого ответа here

В моем случае мне нужно:

  1. имеют initPicker(context) метод по ссылке

    /** 
    * Use reflection to use the Locale of the application for the month spinner. 
    * 
    * PS: DAMN DATEPICKER DOESN'T HONOR Locale.getDefault() 
    * <a href="http://code.google.com/p/android/issues/detail?id=25107">Bug Report</a> 
    * @param context 
    */ 
    public void initPicker(Context context) { 
        String monthPickerVarName; 
        String months[] = context.getResources().getStringArray(R.array.short_months); 
    
        if (Build.VERSION.SDK_INT >= 14) { 
         monthPickerVarName = "mMonthSpinner"; 
        } else { 
         monthPickerVarName = "mMonthPicker"; 
        } 
    
        try { 
         Field f[] = mDatePicker.getClass().getDeclaredFields(); 
    
         for (Field field : f) { 
          if (field.getName().equals("mShortMonths")) { 
           field.setAccessible(true); 
           field.set(mDatePicker, months); 
          } else if (field.getName().equals(monthPickerVarName)) { 
           field.setAccessible(true); 
           Object o = field.get(mDatePicker); 
           if (Build.VERSION.SDK_INT >= 14) { 
            Method m = o.getClass().getDeclaredMethod("setDisplayedValues", String[].class); 
            m.setAccessible(true); 
            m.invoke(o, (Object)months); 
           } else { 
            Method m = o.getClass().getDeclaredMethod("setRange", int.class, int.class, String[].class); 
            m.setAccessible(true); 
            m.invoke(o, 1, 12, (Object)months); 
           } 
          } 
         } 
    
        } catch (Exception e) { 
         Log.e(TAG, e.getMessage(), e); 
        } 
    
        try { 
         final Method updateSpinner = mDatePicker.getClass().getDeclaredMethod("updateSpinners"); 
         updateSpinner.setAccessible(true); 
         updateSpinner.invoke(mDatePicker); 
         updateSpinner.setAccessible(false); 
    
    
        } catch (Exception e) { 
         Log.e(TAG, e.getMessage(), e); 
        } 
    
    } 
    
  2. позвонить initPicker(context) перед звонком в picker.init(...) в onViewCreated метод моего настраиваемого виджета

  3. Определение short_months в рес/значений/arrays.xml

    <string-array name="months_values"> 
        <item>Jan</item> 
        <item>Feb</item> 
        <item>Mar</item> 
        <item>Apr</item> 
        <item>May</item> 
        <item>Jun</item> 
        <item>Jul</item> 
        <item>Aug</item> 
        <item>Sep</item> 
        <item>Oct</item> 
        <item>Nov</item> 
        <item>Dec</item> 
    </string-array> 
    
  4. Определение short_months в разрешении/значения-Ru/arrays.xml (в этом вопросе должен быть аналог Рез/значения-FR/массивы. XML)

    <string-array name="months_values"> 
        <item>Янв</item> 
        <item>Фев</item> 
        <item>Мар</item> 
        <item>Апр</item> 
        <item>Май</item> 
        <item>Июн</item> 
        <item>Июл</item> 
        <item>Авг</item> 
        <item>Сеп</item> 
        <item>Окт</item> 
        <item>Ноя</item> 
        <item>Дек</item> 
    </string-array> 
    
+0

работал отлично ... thankyou – praveenb

+1

Привет, ребята, не могли бы вы рассказать мне, какой минимальный целевой API установлен в вашем приложении, потому что я получаю java.lang.NoSuchMethodException: updateSpinners [] в этом line: final Метод updateSpinner = mDatePicker.getClass(). getDeclaredMethod ("updateSpinners"); – DoubleK

+0

В моем приложении это было 16 и 21. Как мы видим, в API уровня 9 добавлен метод _getDeclaredMethod() _. Это означает, что это решение не будет работать для устройств ниже уровня API 9. Если вы разрабатываете для устройств ниже вас необходимо использовать это решение только для устройств с уровня API 9 и нелокализованного/альтернативного решения для других устройств. Возможно, вы можете получить все методы с помощью метода _getDeclaringMethods() _, а затем итерации через них. (Просто подсказка, я не пробовал.) –

15

Я сделал это!

Я добавил эти 2 строки до всего материала DatePickerDialog:

Locale locale = getResources().getConfiguration().locale; 
Locale.setDefault(locale); 

, и после этого:

Calendar c = Calendar.getInstance(); 
int mYear = c.get(Calendar.YEAR); 
int mMonth = c.get(Calendar.MONTH); 
int mDay = c.get(Calendar.DAY_OF_MONTH); 
DatePickerDialog dialog = new DatePickerDialog(MainActivity.this, 
      this, mYear, mMonth, mDay); 
dialog.getDatePicker().setMaxDate(c.getTimeInMillis()); 
dialog.setTitle(R.string.main_first_day_of_your_last_period); 
dialog.show(); 

Я надеюсь, это поможет кому-то.

+0

@llightbyte спасибо большое :) – Woppi

0

Ответ Игоря мне очень помог.Но я хотел бы добавить, что вы можете столкнуться с NoSuchMethodException, как указал DoubleK, потому что в некоторых версиях TimePicker и DatePicker существуют отдельные классы, такие как TimePickerSpinnerDelegate и DatePicker.DatePickerSpinnerDelegate, которые содержат эти переменные и методы. Вот как я обновил сборщиков (для API 14+):

private void initPicker(Object object, String[] values) { 
     try { 
      Field[] fields = object.getClass().getDeclaredFields(); 

      for (Field field : fields) { 
       // If there's a delegate, we use it instead. 
       if (field.getName().equals("mDelegate")) { 
        field.setAccessible(true); 
        object = field.get(object); 
        fields = object.getClass().getDeclaredFields(); 
        break; 
       } 
      } 

      for (Field field : fields) { 
       if (field.getName().equals("mAmPmStrings") || 
         field.getName().equals("mShortMonths")) { 
        field.setAccessible(true); 
        field.set(object, values); 
       } else if (field.getName().equals("mAmPmSpinner") || 
         field.getName().equals("mMonthSpinner")) { 
        field.setAccessible(true); 
        Object innerObject = field.get(object); 
        Method method = innerObject.getClass().getDeclaredMethod(
          "setDisplayedValues", String[].class); 
        method.setAccessible(true); 
        method.invoke(innerObject, (Object) values); 
       } 
      } 

      Method[] methods = object.getClass().getDeclaredMethods(); 

      for (Method method : methods) { 
       if (method.getName().equals("updateAmPmControl") || 
         method.getName().equals("updateSpinners")) { 
        method.setAccessible(true); 
        method.invoke(object); 
        break; 
       } 
      } 
     } catch (Exception e) { 
      Log.e(APP_TAG, e.getMessage(), e); 
     } 
    } 

Так что я просто называю

initPicker(timePicker, resources.getStringArray(R.array.am_pm)); 

и

initPicker(datePicker, resources.getStringArray(R.array.calendar_months)); 

после представления создаются и все работает, как ожидалось.

Смежные вопросы