如何更改安卓O / 奥利奥 / api 26应用程序语言

2022-09-01 15:03:46

我想更改应用程序的语言,这在API 26之前工作正常。

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

文档没有对此进行太多解释。


答案 1

我遇到了同样的问题:由于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());
}

答案 2

是的,在Android中,奥利奥本地化在更新配置中无法正常工作。但它在android N本身中被弃用了。在每个附加上下文中使用创建配置,而不是更新配置。它对我来说工作正常。试试这个...

在您的活动中添加此内容。

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

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