我有一个应用程序,如果用户的设备语言设置为“ Slovak”,则该应用程序的语言为“ Slovak”,否则为EN。因此,语言不会在应用程序中发生变化,而是来自安装SK或EN。
String languageToLoad = Resources.getSystem().getConfiguration().locale.getLanguage();
String lng = "sk".equals(languageToLoad) ? "sk" : "en";
Locale locale = new Locale(lng);Locale.setDefault(locale);
Configuration config = new Configuration();config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
我注意到,Configuration N中的语言环境已被弃用,Resources中的updateConfiguration(Configuration,DisplayMetrics)也已被android N弃用(我认为)。
但是由于某些原因,它仍然可以在更高版本的Android上使用,但Android Studio表示已弃用。
所以我试图分离代码:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
String languageToLoad = Resources.getSystem().getConfiguration().getLocales().get(0).getLanguage();
String lng = "sk".equals(languageToLoad) ? "sk" : "en";
Locale locale = new Locale(lng);Locale.setDefault(locale);
Configuration config = new Configuration();config.setLocale(locale);
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
} else {
String languageToLoad = Resources.getSystem().getConfiguration().locale.getLanguage();
String lng = "sk".equals(languageToLoad) ? "sk" : "en";
Locale locale = new Locale(lng);Locale.setDefault(locale);
Configuration config = new Configuration();config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
}
,但第一个条件(对于> = N)不正确,我不确定如何替换当前代码。仍然说updateConfiguration已过时。
即使我尝试getBaseContext().createConfigurationContext(config);
也不会改变语言
答案 0 :(得分:1)
当API> = N时,替换为:
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
由此:
context.createConfigurationContext(config);
但是,您必须创建一个自定义上下文包装器,并确保重新启动活动。查看下一个接受的答案:
答案 1 :(得分:0)
好,所以我这样解决了:
在单独的java文件中创建了一个ContextWrapper:
public class ContextWrapper extends android.content.ContextWrapper {
public ContextWrapper(Context base) {
super(base);
}
public static ContextWrapper wrap(Context context, Locale newLocale) {
Resources res = context.getResources();
Configuration configuration = res.getConfiguration();
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 {
configuration.locale = newLocale;
res.updateConfiguration(configuration, res.getDisplayMetrics());
}
return new ContextWrapper(context);
}
}
然后在我的MainActivity中像这样使用它:
@Override
protected void attachBaseContext(Context newBase) {
String languageToLoad;
String lng;
Locale locale;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
languageToLoad = Resources.getSystem().getConfiguration().getLocales().get(0).getLanguage();
}
else { languageToLoad = Resources.getSystem().getConfiguration().locale.getLanguage();
}
lng = "sk".equals(languageToLoad) ? "en" : "sk";
locale = new Locale(lng);Locale.setDefault(locale);
Context context = ContextWrapper.wrap(newBase, locale);
super.attachBaseContext(context);
}
现在看起来工作正常