Java 如何使用上下文包装器在运行时更改应用程序语言?
我想添加一个选项来更改具有共享首选项的应用程序语言。我在共享首选项中保存了类似“en”或“fa”的语言 现在我需要将共享首选项数据设置为语言。我试着使用,但遇到了一些问题 要使用此代码,我应该将活动上下文包装为:Java 如何使用上下文包装器在运行时更改应用程序语言?,java,android,localization,sharedpreferences,Java,Android,Localization,Sharedpreferences,我想添加一个选项来更改具有共享首选项的应用程序语言。我在共享首选项中保存了类似“en”或“fa”的语言 现在我需要将共享首选项数据设置为语言。我试着使用,但遇到了一些问题 要使用此代码,我应该将活动上下文包装为: @Override protected void attachBaseContext(Context newBase) { super.attachBaseContext(MyContextWrapper.wrap(newBase,languageFromPrefs)); }
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(MyContextWrapper.wrap(newBase,languageFromPrefs));
}
我编写了一个从共享首选项获取语言的方法,名为getString(上下文上下文、字符串键、字符串默认值)
,然后将该代码编辑为:
@Override
protected void attachBaseContext(Context newBase) {
lang = App.Prefs.getString(newBase, App.Prefs.LANGUAGE_KEY,"fa");
super.attachBaseContext(MyContextWrapper.wrap(newBase,lang));
}
看起来不错,但当我运行我的应用程序时,我看到了一个奇怪的场景。第一次运行时,应用程序语言是fa(波斯语),下一次它会自动更改为en(英语)
[注:设备语言目前为英语]
这是我的主要活动: (我评论了与我的问题无关的代码) 和getString方法(
App.Prefs.getString()
):
我的应用程序运行时没有任何错误。
我应该做什么来解决这个问题?怎么了?在运行时更改语言时必须使用这种方法
SharedPreferences LanguagePreference = getSharedPreferences("SelectedLanguage", 0);
String languageToLoad = LanguagePreference.getString("Language", null);
Locale locale =null;
if(languageToLoad!=null && languageToLoad.equals("english"))
locale =new Locale("en", "US");
else if(languageToLoad!=null && languageToLoad.equals("tamil"))
locale =new Locale("ta", "IN");
else
locale =new Locale("en", "US");
Locale.setDefault(locale);
Configuration config = new Configuration();
config.setLocale(locale);
getBaseContext().getResources().updateConfiguration(config,
getBaseContext().getResources().getDisplayMetrics());
这应该在基本活动中完成,它由项目中的每个活动扩展。我不能使用它,因为
config.locale
已被弃用。这可能会导致高API出现问题。请参阅我的更新帖子。您可以使用config.setLocale
代替config.locale
也可以使用config.setLocale
来解决问题。它需要API 17及更高版本。我需要一个API 15和更高版本的方法。请检查下面的链接:@nomag实际上与相同。我在运行我的应用程序时用这段代码看到了一个奇怪的场景。第一次运行时,应用程序语言是fa(波斯语),下一次它会自动更改为en(英语)!
static String getString(Context context,String key,String defaultValue)
{
SharedPreferences shared = context.getSharedPreferences("Prefs", MODE_PRIVATE);
return shared.getString(key, defaultValue);
}
SharedPreferences LanguagePreference = getSharedPreferences("SelectedLanguage", 0);
String languageToLoad = LanguagePreference.getString("Language", null);
Locale locale =null;
if(languageToLoad!=null && languageToLoad.equals("english"))
locale =new Locale("en", "US");
else if(languageToLoad!=null && languageToLoad.equals("tamil"))
locale =new Locale("ta", "IN");
else
locale =new Locale("en", "US");
Locale.setDefault(locale);
Configuration config = new Configuration();
config.setLocale(locale);
getBaseContext().getResources().updateConfiguration(config,
getBaseContext().getResources().getDisplayMetrics());
@Override
protected void attachBaseContext(Context newBase) {
super.attachBaseContext(MyContextWrapper.wrap
(newBase,languageFromPrefs));
}