2014-01-21 75 views
11

有什麼辦法我已經搜索關於這一點,但沒有結果發現設置語言爲法語在android系統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); 

而不是2014年11月21日星期五我想要法語縮寫 我還補充說,在實例化之前:

Locale locale = new Locale("FR"); 
Locale.setDefault(locale); 
Configuration config = new Configuration(); 
config.locale = locale; 
getApplicationContext().getResources().updateConfiguration(config, null); 
+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和日期選擇器實現來實現自己的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在res /值/ 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在res /值茹/ arrays.xml(在這個問題必須是模擬RES /值-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

完美工作...謝謝你 – praveenb

+1

嗨,你可以請告訴我哪個最小,目標API設置在你的應用程序,因爲我得到java.lang.NoSuchMethodException:updateSpinners []在這個line:final方法updateSpinner = mDatePicker.getClass()。getDeclaredMethod(「updateSpinners」); – DoubleK

+0

在我的應用程序中,它是16和21.我們可以看到_getDeclaredMethod()_方法已添加到API級別9中。這意味着此解決方案對於API級別9以下的設備不起作用。如果您正在開發下面的設備只需要將此解決方案用於來自API級別9的設備以及其他設備的非本地化/替代解決方案。 也許你可以用_getDeclaringMethods()_方法獲得所有方法,然後遍歷它們。 (只是一個暗示,我沒有嘗試過。) –

15

我成功了!

我加入之前,所有的東西DatePickerDialog這2行:

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指出,因爲在一些TimePickerDatePicker實現中有獨立的類,如TimePickerSpinnerDelegateDatePicker.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)); 

在創建後的意見,一切都按預期工作。