Смена языка вручную не работает на устройствах Samsung

У меня проблемы с изменением языка приложения вручную, в приложении я предлагаю пользователям возможность изменить язык приложения на свой предпочтительный, приведенный ниже код отлично работает даже в Android (Эмулятор Pixel 3) , но почему-то работает не на всех устройствах Samsung

            Context context = LocaleUtils.setLocale(getApplicationContext(), languageCode);
            Resources resources = context.getResources();
            Locale myLocale = new Locale(languageCode);
            DisplayMetrics dm = resources.getDisplayMetrics();
            Configuration conf = resources.getConfiguration();
            conf.locale = myLocale;
            resources.updateConfiguration(conf, dm);
            Intent intent = getBaseContext().getPackageManager().getLaunchIntentForPackage(
                    getBaseContext().getPackageName());
            if (intent != null) {
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
                startActivity(intent);
            }

Класс приложения:

 @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        LocaleUtils.onAttach(base, Locale.getDefault().getLanguage());
        MultiDex.install(this);
   }

по каждому действию:

  @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(ViewPumpContextWrapper.wrap(LocaleUtils.onAttach(newBase)));
    }

person Mouaad Abdelghafour AITALI    schedule 08.03.2020    source источник
comment
У меня точно такая же проблема. Я безуспешно пробовал несколько библиотек. Мне, наконец, удалось заполучить устройство Samsung, и я отлаживал, что в некоторых случаях вызов getResources () в действии возвращает ресурсы, для которых в конфигурации задан исходный языковой стандарт. Кажется, бывают случаи, когда что-то еще переопределяет локаль в действии. PS: Я переопределяю языковой стандарт в методе onCreate в каждом действии.   -  person NewestStackOverflowUser    schedule 15.01.2021
comment
Мне только что удалось исправить это для устройства, которое у меня есть. В итоге я использовал это решение stackoverflow.com/a/59370534/3296947 и вызвал его в attachBaseContext действия сразу после вызов super (). Подробнее по этой теме здесь: stackoverflow.com/questions/55265834/   -  person NewestStackOverflowUser    schedule 16.01.2021


Ответы (1)


Я боролся с динамическим изменением локали на устройствах Samsung даже до Android 10.
Возможно, сейчас есть лучшее решение,
но в то время, помимо того, что вы сделали,
в итоге я получил все строки по идентификаторам ресурсов следующим образом:

public static String getStringByIdentifier(final Context context, final String stringResIdName, final boolean forceRefresh) {
        final Resources res = getResources(context, forceRefresh);
        String result;
        try {
            result = res.getString(res.getIdentifier(stringResIdName, "string",
                    context.getPackageName()));
        } catch (final Resources.NotFoundException e) {
            result = stringResIdName; // TODO or here you may throw an Exception and handle it accordingly. 
        }
        return result;
    }

public static String getStringByIdentifier(final Context context, final String stringResIdName) {
        return getStringByIdentifier(context, stringResIdName, false);
    }

 private static Resources getResources(final Context context, final boolean refreshLocale) {
        if (!refreshLocale) {
            return context.getResources();
        } else {
            final Configuration configuration = new Configuration(context.getResources().getConfiguration());
            configuration.setLocale(Locale.getDefault());
            return context.createConfigurationContext(configuration).getResources();
        }
    }

Итак, вам нужно установить текст следующим образом:

textView.setText(AndroidUtils.getStringByIdentifier(context, "string_res_name"));

Где соответствующий строковый ресурс:

<string name="string_res_name">Some string</string>
person Leo Droidcoder    schedule 08.03.2020