У меня болит голова в локальном приложении. Таким образом, в основном мое приложение поддерживает два языка, английский и вьетнамский, и пользователь может выбрать способ изменения отображаемого языка. Так что у меня SettingActivity
так:Android - изменение локалей и отображаемая ориентация приложения
public class SettingsActivity extends SherlockPreferenceActivity implements OnPreferenceChangeListener{
private ListPreference langPref;
private SharedPreferences languagepref;
private String language;
private Locale locale;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
languagepref = PreferenceManager.getDefaultSharedPreferences(this);
Configuration config = getBaseContext().getResources().getConfiguration();
language = languagepref.getString("languageToLoad","en");
locale = new Locale(language);
Locale.setDefault(locale);
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
addPreferencesFromResource(R.xml.preferences_login);
langPref = (ListPreference) findPreference("lang_pref");
if (language.equalsIgnoreCase("vi")){
langPref.setValueIndex(1);
}
else{
langPref.setValueIndex(0);
}
langPref.setOnPreferenceChangeListener(this);
}
@Override
public boolean onPreferenceChange(Preference preference, Object newValue) {
String key = preference.getKey();
if (key.equals("lang_pref")){
String languageToLoad = (String) newValue;
Locale locale = new Locale(languageToLoad);
Locale.setDefault(locale);
Configuration config = new Configuration();
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config,
getBaseContext().getResources().getDisplayMetrics());
SharedPreferences.Editor editor = languagepref.edit();
editor.putString("languageToLoad",languageToLoad);
editor.commit();
recreate();
}
return false;
}
}
В любой другой деятельности, я добавляю это в их методе onCreate
:
SharedPreferences languagepref = PreferenceManager.getDefaultSharedPreferences(this);
Configuration config = getBaseContext().getResources().getConfiguration();
String language = languagepref.getString("languageToLoad","en");
Locale locale = new Locale(language);
Locale.setDefault(locale);
config.locale = locale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
А теперь мое приложение действует странно: в SettingActivity
, язык отображается правильно всякий раз, когда я поворачиваю свое устройство, даже без необходимости добавления android:configChanges="locale"
в манифест активности. Однако при каждом другом действии, когда я поворачиваю устройство, язык изменяется на английский. Я попытался добавить android:configChanges="locale"
в свой манифест, но он не работает. Кроме того, я пробовал все решения, найденные в Stackoverflow, но ни один из них не работает для меня, поэтому я в принципе не знаю. Может ли кто-нибудь из вас помочь мне указать на ошибку, которую я здесь сделал? Прошу вас и спасибо заранее.
вместо использования getBaseContext(), попробуйте использовать getApplicationContext() – TacB0sS
Я сам столкнулся с головной болью с локализацией: http://android-know-how-to.blogspot.co.il/2013/08 /multi-language-android-application.html – TacB0sS