猿问

以编程方式设置区域设置

以编程方式设置区域设置

我的应用程序支持3种(很快是4种)语言。由于几个地区非常相似,我想给用户在我的应用程序中更改语言环境的选项,例如,一个意大利人可能更喜欢西班牙语而不是英语。

用户是否可以从应用程序可用的区域设置中选择,然后更改所使用的区域设置?我不认为每个活动设置区域设置是一个问题,因为这是一个在基类中执行的简单任务。


繁花不似锦
浏览 499回答 3
3回答

红糖糍粑

希望这一帮助(在onResume中):Locale locale = new Locale("ru");Locale.setDefault(locale);Configuration config = getBaseContext() .getResources().getConfiguration();config.locale = locale;getBaseContext().getResources().updateConfiguration(config,       getBaseContext().getResources().getDisplayMetrics());

呼啦一阵风

@SuppressWarnings("deprecation")public static void forceLocale(Context context, String localeCode) {     String localeCodeLowerCase = localeCode.toLowerCase();     Resources resources = context.getApplicationContext().getResources();     Configuration overrideConfiguration = resources.getConfiguration();     Locale overrideLocale = new Locale(localeCodeLowerCase);     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {         overrideConfiguration.setLocale(overrideLocale);     } else {         overrideConfiguration.locale = overrideLocale;     }     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {         context.getApplicationContext().createConfigurationContext(overrideConfiguration);     } else {         resources.updateConfiguration(overrideConfiguration, null);     }}只需使用此助手方法强制执行特定的区域设置。2017年8月22日。更好地利用这种方法.

不负相思意

对于那些仍在寻找这个答案的人来说,因为configuration.locale从API 24中删除,您现在可以使用: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);     }}不要忘记,如果您使用正在运行的活动更改区域设置,则需要重新启动它才能使更改生效。2018年5月11日编辑从@CookiEMonster的帖子来看,在更高的API版本中保持区域设置更改可能会遇到问题。如果是这样,将以下代码添加到基本活动中,以便更新每个活动创建的上下文区域设置:@Overrideprotected 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;}如果使用此方法,请不要忘记将语言保存到SharedPreferences中。setLocate(locale)
随时随地看视频慕课网APP

相关分类

Android
我要回答