В своем приложении я пытаюсь изменить язык runtime, то есть в процессе работы. Я уже задавал вопрос, но на него никто не ответил, поэтому я продолжил дальше самостоятельно разбираться с этим вопросом.
Задача стоит предельно четкая сделать полную поддержку нескольких языков приложением: что-бы на лету пересоздавалась активити с новым языком, и дальше выбранный язык сохранялся в настройках приложения, и при последующих запусках использовался этот сохраненный язык.
Что у меня на данный момент получилось сделать:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && resultCode == Activity.RESULT_OK) {
String countryCode = data.getStringExtra(CountrycodeActivity.RESULT_CONTRYCODE);
String lang = "en";
switch (countryCode) {
case "English":
lang = "en";
break;
case "Deutsch":
break;
case "Русский":
lang = "ru";
break;
case "Español":
break;
}
Toast.makeText(this, "Your native language is:" + countryCode, Toast.LENGTH_LONG).show();
changeLang(lang);
}
}
private void changeLang(String lang) {
if (lang.equalsIgnoreCase(""))
return;
Locale myLocale = new Locale(lang);
saveLocale(lang);
Locale.setDefault(myLocale);
android.content.res.Configuration config = new android.content.res.Configuration();
config.locale = myLocale;
getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());
Intent intent = new Intent(this, LoginActivity.class);
startActivity(intent);
finish();
overridePendingTransition(0, 0);
}
private void saveLocale(String lang) {
String langPref = "Language";
SharedPreferences prefs = getSharedPreferences("def_loc", 0);
SharedPreferences.Editor editor = prefs.edit();
editor.putString(langPref, lang);
editor.apply();
}
с приведенного кода сверху можно понять, что у меня есть список необходимых мне языков. Нажимая на нужный язык, я автоматом пересоздаю активити с новым языком. Я проверил все ок, то есть выбираем нужный язык и дальше активити уже с необходимым языком. Дальше я пытаюсь сохранить нужный мне язык что-бы потом, даже если приложение закрыли (не свернули) я мог при запуске иметь уже заранее выбранный язык. Вот что я закинул в функцию onStart() чтобы активити сразу при старте сетило язык:
@Override
protected void onStart() {
sp = getSharedPreferences("def_loc", 0);
String strLocal = sp.getString("def_loc", "en");
changeLang(strLocal);
super.onStart();
}
но у меня после запуска активити идет зацикливание, то есть постоянно запускается функция onStart() и дальше метод для смены языка. Я не могу понять как по-нормальному вызвать метод что-бы не было зацикливания, и чтобы после перезагрузки программы у меня сетился язык который был выбран во время предыдущей сессии. Надеюсь на вашу помощь.