Программное изменение языка приложения в более старых android версиях - PullRequest
0 голосов
/ 16 июня 2020

Я использую этот код для изменения языка приложения во время выполнения, и он хорошо работает на android 8 и выше, но не работает на android 7 и ниже. Может ли кто-нибудь помочь мне исправить это или показать лучший способ предоставить пользователю возможность изменить язык приложения во время выполнения для всех действий?

private void setLocale(String lang) {
        Locale locale = new Locale(lang);
        Locale.setDefault(locale);
        Configuration config = new Configuration();
        config.locale = locale;
        getBaseContext().getResources().updateConfiguration(config, getBaseContext().getResources().getDisplayMetrics());

        SharedPreferences.Editor editor = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE).edit();
        editor.putString(MY_LANG, lang);
        editor.apply();
    }

    public void loadLocale() {
        SharedPreferences prefs = getSharedPreferences(SHARED_PREFS, Activity.MODE_PRIVATE);
        String languages = prefs.getString(MY_LANG, "");
        setLocale(languages);

    }

1 Ответ

0 голосов
/ 11 июля 2020

Приведенный ниже код на 100% работает для меня на каждой Android версии:

Язык сохранения:

public void setLocal(String lang) {
    Resources res = getContext().getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    Configuration conf = res.getConfiguration();
    conf.setLocale(new Locale(lang));
    res.updateConfiguration(conf, dm);
    getActivity().recreate();   // to change app language runtime, e.g. in Settings

    SharedPreferences.Editor editor = getSharedPreferences(SHARED_PREFS, MODE_PRIVATE).edit();
    editor.putString(MY_LANG, lang);
    editor.apply();
 }

Язык загрузки:

public void loadLanguage(String lang) {
    SharedPreferences prefs = getSharedPreferences(SHARED_PREFS, Activity.MODE_PRIVATE);
    String lang = prefs.getString(MY_LANG, "");

    Resources res = getResources();
    DisplayMetrics dm = res.getDisplayMetrics();
    Configuration conf = res.getConfiguration();
    conf.setLocale(new Locale(lang));
    res.updateConfiguration(conf, dm);
}

Вы должны вызывать метод loadLanguage () в каждом действии.

Лучшее решение - расширить все ваши действия из базового действия и реализовать loadLanguage () метод там. Обязательно вызывайте его как в onCreate, так и в onResume (и, возможно, в onConfigurationChanged тоже).

К сожалению, названия действий могут изменяться в зависимости от выбранного языка, поэтому включите следующую строку в метод onCreate каждого действия:

setTitle(R.string.activity_title);
...