Java 如何使用上下文包装器在运行时更改应用程序语言?

Java 如何使用上下文包装器在运行时更改应用程序语言?,java,android,localization,sharedpreferences,Java,Android,Localization,Sharedpreferences,我想添加一个选项来更改具有共享首选项的应用程序语言。我在共享首选项中保存了类似“en”或“fa”的语言 现在我需要将共享首选项数据设置为语言。我试着使用,但遇到了一些问题 要使用此代码,我应该将活动上下文包装为: @Override protected void attachBaseContext(Context newBase) { super.attachBaseContext(MyContextWrapper.wrap(newBase,languageFromPrefs)); }

我想添加一个选项来更改具有共享首选项的应用程序语言。我在共享首选项中保存了类似“en”或“fa”的语言

现在我需要将共享首选项数据设置为语言。我试着使用,但遇到了一些问题

要使用此代码,我应该将活动上下文包装为:

@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));
 }