Android context.getResources.updateConfiguration() deprecated

后端 未结 7 697
死守一世寂寞
死守一世寂寞 2020-11-22 16:05

Just recently context.getResources().updateConfiguration() has been deprecated in Android API 25 and it is advised to use context.createConfigurationContext() instead.

7条回答
  •  星月不相逢
    2020-11-22 16:55

    Inspired by Calligraphy & Mourjan & myself, i created this.

    first you must create a subclass of Application:

    public class MyApplication extends Application {
        private Locale locale = null;
    
        @Override
        public void onCreate() {
            super.onCreate();
    
            SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    
            Configuration config = getBaseContext().getResources().getConfiguration();
    
            String lang = preferences.getString(getString(R.string.pref_locale), "en");
            String systemLocale = getSystemLocale(config).getLanguage();
            if (!"".equals(lang) && !systemLocale.equals(lang)) {
                locale = new Locale(lang);
                Locale.setDefault(locale);
                setSystemLocale(config, locale);
                updateConfiguration(config);
            }
        }
    
        @Override
        public void onConfigurationChanged(Configuration newConfig) {
            super.onConfigurationChanged(newConfig);
            if (locale != null) {
                setSystemLocale(newConfig, locale);
                Locale.setDefault(locale);
                updateConfiguration(newConfig);
            }
        }
    
        @SuppressWarnings("deprecation")
        private static Locale getSystemLocale(Configuration config) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                return config.getLocales().get(0);
            } else {
                return config.locale;
            }
        }
    
        @SuppressWarnings("deprecation")
        private static void setSystemLocale(Configuration config, Locale locale) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                config.setLocale(locale);
            } else {
                config.locale = locale;
            }
        }
    
        @SuppressWarnings("deprecation")
        private void updateConfiguration(Configuration config) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
                getBaseContext().createConfigurationContext(config);
            } else {
                getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
            }
        }
    }
    

    then you need set this to your AndroidManifest.xml application tag:

    
    

    and add this to your AndroidManifest.xml activity tag.

    
    

    note that pref_locale is a string resource like this:

    fa
    

    and hardcode "en" is default lang if pref_locale is not setted

提交回复
热议问题