Search code examples
androidlocalizationtimepickerarabic-support

TimePicker AM/PM not changing with locale


For Arabic language I want to show TimePicker in English format.

Locale.setDefault(Locale.ENGLISH); Worked for me but AM/PM is not changing.

enter image description here


Solution

  • I have created a function to set AM/PM use reflect, You can refer:

    import java.lang.reflect.Field;
    import java.lang.reflect.Method;
    
    public class CustomTimePicker {
        static 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("error", e.getMessage(), e);
            }
        }
    }
    

    To use, you set default language and change AM/PM - Create file array am_pm in res/values/attrs.xml

    <string-array name="am_pm">
        <item>am</item>
        <item>pm</item>
    </string-array>
    

    - when use:

    Locale.setDefault(Locale.ENGLISH)
    CustomTimePicker.initPicker(yourTimePicker, resources.getStringArray(R.array.am_pm))
    

    - Result: result