Set language to French in android DatePickerDialog

不想你离开。 提交于 2020-01-27 02:27:38

问题


Is there any way to have date displayed in DatePickerDialog in french

I have searched about this but found no results

Here is my code:

 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);

Instead of Fri, Nov 21, 2014 I want to have french abbreviation I have also added that before instantiate it :

 Locale locale = new Locale("FR");
 Locale.setDefault(locale);
 Configuration config = new Configuration();
 config.locale = locale;
 getApplicationContext().getResources().updateConfiguration(config, null);

回答1:


I made it!

I have added these 2 lines before all the DatePickerDialog stuff:

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

and after that:

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();

I hope it helps someone.




回答2:


I had almost similar problem and I found solution for this answer here

In my case I needed:

  1. have initPicker(context) method from the link

    /**
     * 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. to call initPicker(context) before call to picker.init(...) in onViewCreated method of my custom widget

  3. Define short_months in res/values/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. Define short_months in res/values-ru/arrays.xml (in this question must be analogue res/values-fr/arrays.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>
    



回答3:


You can just add this declaration before DatePicker:

Locale.setDefault(Locale.FRANCE);



回答4:


Relevant classes:

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

Currently I don't see any possibility to use the standard one with usage of localisation options or reuse the timepickerdialog and datepicker implementation to implement your own calenderview (you can get the calenderview but you can't set a calenderview). You can always implement your own custom dialog.

Also I found this opensource library on the web.

It indicates that it would handle local settings. Haven't tried it though.




回答5:


Igor's answer helped me a lot. But I'd like to add that you might run into NoSuchMethodException as DoubleK pointed out, because in some TimePicker and DatePicker implementations there're separate classes like TimePickerSpinnerDelegate and DatePicker.DatePickerSpinnerDelegate which contain these variables and methods. Here's how I updated the pickers (for 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);
        }
    }

So I just call

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

and

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

after the views are created and everything works as expected.




回答6:


You may try changing context of DateDialogPicker dialog. Whenever such problem occurs most of the time it's because of your current context.

I had same problem, sometimes I was able to change the languagle but some times not, so I tried changing context and now it's working fine. Before it was fragment context (requireContext()) as below -

datePickerDialog = DatePickerDialog(
            requireContext(), R.style.TimePickerTheme.....

but later I changed to below (activity context - requireActivity()) that is working fine-

datePickerDialog = DatePickerDialog(
            requireActivity(), R.style.TimePickerTheme.....


来源:https://stackoverflow.com/questions/21257014/set-language-to-french-in-android-datepickerdialog

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!