@Drew20
Недопрограммист Android))

Как сделать нормальную однократную перезагрузку активити без зацикливания программы при смене локали android?

В своем приложении я пытаюсь изменить язык 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() и дальше метод для смены языка. Я не могу понять как по-нормальному вызвать метод что-бы не было зацикливания, и чтобы после перезагрузки программы у меня сетился язык который был выбран во время предыдущей сессии. Надеюсь на вашу помощь.
  • Вопрос задан
  • 258 просмотров
Пригласить эксперта
Ответы на вопрос 2
iLLuzor
@iLLuzor
Java, Kotlin, Android Developer
Конечно будет зацикливание. Вы в методе changeLang() запускаете активити. Получается, что после запуска активити запускает ещё одно и так до бесконечности.
Ответ написан
akaish
@akaish
Стек Java\Android
Вы в onStart() запускаете метод changeLang(strLocal), который независимо от того, является ли нужная локаль запрошенной, перезапускает активити. У Вас бесконечный цикл.
Добавьте в changeLang(String) if ветвление с проверкой на текущую локалью, если она соответствует запрашиваемой - просто выходите из метода.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы