android - 更改 android 语言环境时保持当前 sharedPreferences
问题描述
当我更改手机的区域设置/语言时,保存在 sharedPreference 上的参数(选择的主题和翻译功能的目标语言)会变为默认值。例如,首选项的默认值是主题的“light”和目标语言的“en”。我将首选项更改为主题的“dark”和目标语言的“de”。如果我从“设置”中更改语言环境,主题偏好会变为“浅色”,目标语言偏好会再次变为“en”。我怎样才能防止这种变化?
我已经尝试过 onConfigurationChanged() 方法,但它仅在活动运行时触发。在活动未运行时更改区域设置时不会触发它。
这是 onPreferenceChange(Preference preference, Object value) 方法:
String stringValueLanguage = value.toString();
preference.setSummary(stringValueLanguage);
switch (stringValueLanguage) {
//Language selection preference is set according to different locales:
case LanguagesEN.Constants.ENGLISH_VALUE:
case LanguagesTR.Constants.ENGLISH_VALUE:
case LanguagesDE.Constants.ENGLISH_VALUE:
case LanguagesES.Constants.ENGLISH_VALUE:
case LanguagesFR.Constants.ENGLISH_VALUE:
language = LanguageCodes.Constants.ENGLISH_CODE_VALUE;
break;
case LanguagesEN.Constants.TURKISH_VALUE:
case LanguagesTR.Constants.TURKISH_VALUE:
case LanguagesDE.Constants.TURKISH_VALUE:
case LanguagesES.Constants.TURKISH_VALUE:
case LanguagesFR.Constants.TURKISH_VALUE:
language = LanguageCodes.Constants.TURKISH_CODE_VALUE;
break;
case (LanguagesEN.Constants.GERMAN_VALUE):
case (LanguagesTR.Constants.GERMAN_VALUE):
case (LanguagesDE.Constants.GERMAN_VALUE):
case (LanguagesES.Constants.GERMAN_VALUE):
case (LanguagesFR.Constants.GERMAN_VALUE):
language = LanguageCodes.Constants.GERMAN_CODE_VALUE;
break;
case (LanguagesEN.Constants.FRENCH_VALUE):
case (LanguagesTR.Constants.FRENCH_VALUE):
case (LanguagesDE.Constants.FRENCH_VALUE):
case (LanguagesES.Constants.FRENCH_VALUE):
case (LanguagesFR.Constants.FRENCH_VALUE):
language = LanguageCodes.Constants.FRENCH_CODE_VALUE;
break;
case (LanguagesEN.Constants.SPANISH_VALUE):
case (LanguagesTR.Constants.SPANISH_VALUE):
case (LanguagesDE.Constants.SPANISH_VALUE):
case (LanguagesES.Constants.SPANISH_VALUE):
case (LanguagesFR.Constants.SPANISH_VALUE):
language = LanguageCodes.Constants.SPANISH_CODE_VALUE;
break;
}
//User's language preference is saved in order to be used in TranslateActivity:
SharedPreferences myLanguagePrefs = getActivity().getSharedPreferences(languageKey, MODE_PRIVATE);
SharedPreferences.Editor prefsEditorLanguage = myLanguagePrefs.edit();
prefsEditorLanguage.putString(languageIdKey, language);
prefsEditorLanguage.commit();
//THEME_KEY
String stringValueTheme = value.toString();
preference.setSummary(stringValueTheme);
//User's theme preference is saved in order to used in other Activities:
SharedPreferences myThemePrefs = getActivity().getSharedPreferences(themeKey, MODE_PRIVATE);
SharedPreferences.Editor prefsEditorTheme = myThemePrefs.edit();
switch (stringValueTheme) {
case (Themes.Constants.LIGHT):
theme = Themes.Constants.LIGHT;
prefsEditorTheme.putString(themeIdKey, theme);
prefsEditorTheme.commit();
restartSettingsActivityAfterThemeSelection();
break;
case (Themes.Constants.DARK):
theme = Themes.Constants.DARK;
prefsEditorTheme.putString(themeIdKey, theme);
prefsEditorTheme.commit();
restartSettingsActivityAfterThemeSelection();
break;
}
return true;
}
}
解决方案
我已经解决了这个问题。错误的原因是使用本地化键作为首选项。由于每种语言的键都在变化,因此更新了 sharedPreferences。我为每个语言环境保留了相同的首选项键,问题就解决了。如果有人遇到同样的问题,我希望它可以成为一个解决方案。
推荐阅读
- google-apps-script - 基于特定值保护范围
- excel - 如何在 Excel VBA 中将每个工作表的第一页保存为 PDF
- c# - 任务是异步的还是同步的,没有异步等待?
- reactjs - 获取数据时反应效果无限重新渲染
- javascript - 使用对象值创建文件夹
- python - 如何检查'x'是否在字典值中,如果是则打印相关的字典
- selenium - 无法从 testNG xml 中获取参数化值
- asp.net-mvc - 我们如何在 ASP.NET MVC 中临时限制禁用用户的访问?
- java - android中的自我更新应用程序
- docker - 如何进入正在运行的 docker 容器并检查机器学习训练结果?