如何更改安卓O / 奥利奥 / api 26应用程序语言
我想更改应用程序的语言,这在API 26之前工作正常。
对于api>25,我之前放了,但没有任何变化。Locale.setDefault(Locale.Category.DISPLAY, mynewlanglocale);
setContentView(R.layout.activity_main);
文档没有对此进行太多解释。
我想更改应用程序的语言,这在API 26之前工作正常。
对于api>25,我之前放了,但没有任何变化。Locale.setDefault(Locale.Category.DISPLAY, mynewlanglocale);
setContentView(R.layout.activity_main);
文档没有对此进行太多解释。
我遇到了同样的问题:由于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());
}
是的,在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);
}