我的应用程序支持3种(很快4种)语言.由于几个语言环境非常相似,我想让用户选择在我的应用程序中更改语言环境,例如意大利人可能更喜欢西班牙语而不是英语.
有没有办法让用户在可用于应用程序的语言环境中进行选择,然后更改使用的语言环境?我不认为为每个Activity设置语言环境是一个问题,因为它是在基类中执行的简单任务.
解决方法:
对于仍在寻找此答案的人,由于从API 24弃用了configuration.locale,您现在可以使用:
configuration.setLocale(locale);
考虑到此方法的minSkdVersion是API 17.
完整示例代码:
@SuppressWarnings("deprecation")
private void setLocale(Locale locale){
SharedPrefUtils.saveLocale(locale); // optional - Helper method to save the selected language to SharedPreferences in case you might need to attach to activity context (you will need to code this)
Resources resources = getResources();
Configuration configuration = resources.getConfiguration();
DisplayMetrics displayMetrics = resources.getDisplayMetrics();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1){
configuration.setLocale(locale);
} else{
configuration.locale=locale;
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N){
getApplicationContext().createConfigurationContext(configuration);
} else {
resources.updateConfiguration(configuration,displayMetrics);
}
}
不要忘记,如果使用正在运行的Activity更改语言环境,则需要重新启动它才能使更改生效.
编辑2018年5月11日
从@ CookieMonster的帖子开始,您可能无法在较高的API版本中保持区域设置更改.如果是这样,请将以下代码添加到Base Activity,以便在每次创建Activity时更新上下文区域设置:
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(updateBaseContextLocale(base));
}
private Context updateBaseContextLocale(Context context) {
String language = SharedPrefUtils.getSavedLanguage(); // Helper method to get saved language from SharedPreferences
Locale locale = new Locale(language);
Locale.setDefault(locale);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return updateResourcesLocale(context, locale);
}
return updateResourcesLocaleLegacy(context, locale);
}
@TargetApi(Build.VERSION_CODES.N)
private Context updateResourcesLocale(Context context, Locale locale) {
Configuration configuration = context.getResources().getConfiguration();
configuration.setLocale(locale);
return context.createConfigurationContext(configuration);
}
@SuppressWarnings("deprecation")
private Context updateResourcesLocaleLegacy(Context context, Locale locale) {
Resources resources = context.getResources();
Configuration configuration = resources.getConfiguration();
configuration.locale = locale;
resources.updateConfiguration(configuration, resources.getDisplayMetrics());
return context;
}
如果您使用此功能,请不要忘记在使用setLocate(语言环境)设置语言环境时将语言保存到SharedPreferences