如何更改Android O/Oreo/api 26应用程序语言

Mar*_*rei 23 java android locale default

我想改变应用程序的语言,直到API 26才能正常工作.

对于api> 25我Locale.setDefault(Locale.Category.DISPLAY, mynewlanglocale);之前提出setContentView(R.layout.activity_main);但没有任何变化.

文档不解释太多关于这一点.

小智 24

我有同样的问题:因为Android 8.0+我的应用程序的某些部分不再改变他们的语言.更新应用程序和活动上下文对我有帮助.以下是MainActivity功能的示例:

private void setApplicationLanguage(String newLanguage) {
    Resources activityRes = getResources();
    Configuration activityConf = activityRes.getConfiguration();
    Locale newLocale = new Locale(newLanguage);
    activityConf.setLocale(newLocale);
    activityRes.updateConfiguration(activityConf, activityRes.getDisplayMetrics());

    Resources applicationRes = getApplicationContext().getResources();
    Configuration applicationConf = applicationRes.getConfiguration();
    applicationConf.setLocale(newLocale);
    applicationRes.updateConfiguration(applicationConf, 
    applicationRes.getDisplayMetrics());
}
Run Code Online (Sandbox Code Playgroud)


小智 19

是的在android Oreo本地化与updateconfiguration无法正常工作.但它在Android N本身被弃用了.而不是更新配置使用每个attachcontext中的createconfiguration.它对我来说很好.试试这个...

在你的活动中添加这个..

@Override
protected void attachBaseContext(Context newBase) {
    if(Build.VERSION.SDK_INT > Build.VERSION_CODES.N_MR1) {
        super.attachBaseContext(MyContextWrapper.wrap(newBase, "ta"));
    }
    else {
        super.attachBaseContext(newBase);
    }
}
Run Code Online (Sandbox Code Playgroud)

在MyContextWrapper.java中

 public static ContextWrapper wrap(Context context, String language) {
    Resources res = context.getResources();
    Configuration configuration = res.getConfiguration();
    Locale newLocale = new Locale(language);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        configuration.setLocale(newLocale);
        LocaleList localeList = new LocaleList(newLocale);
        LocaleList.setDefault(localeList);
        configuration.setLocales(localeList);
        context = context.createConfigurationContext(configuration);

    } else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        configuration.setLocale(newLocale);
        context = context.createConfigurationContext(configuration);

    } else {
        configuration.locale = newLocale;
        res.updateConfiguration(configuration, res.getDisplayMetrics());
    }

    return new ContextWrapper(context);
}
Run Code Online (Sandbox Code Playgroud)

  • 在奥利奥设备s8上不适合我.谁能帮我? (3认同)

Luk*_*uke 7

updateConfiguration已弃用,您应该使用createConfigurationContext.我这样解决了:

    @Override
    protected void attachBaseContext(Context newBase) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            Configuration config = newBase.getResources().getConfiguration();
            //Update your config with the Locale i. e. saved in SharedPreferences
            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(newBase);
            String language = prefs.getString(SP_KEY_LANGUAGE, "en_US");
            Locale.setDefault(locale);
            config.setLocale(new Locale(language));
            newBase = newBase.createConfigurationContext(config);
        }
        super.attachBaseContext(newBase);
    }
Run Code Online (Sandbox Code Playgroud)