Смена локали: заставить активность перезагружать ресурсы? - PullRequest
25 голосов
/ 15 апреля 2010

Итак, у меня есть настройка языка в моем приложении. Когда язык переключается, я бы хотел, чтобы все текстовые представления и т. Д. Немедленно меняли язык. В настоящее время я просто изменяю язык в конфигурации, поэтому язык изменился, когда пользователь перезапустил действие.

Уродливое решение моей проблемы - заставить каждое текстовое представление загружать новые ресурсы при каждом изменении языка. Есть ли лучшее решение? Возможно, аккуратный способ дискретно возобновить активность? Или, может быть, просто принудительно перезагрузить ресурсы?

Ответы [ 6 ]

17 голосов
/ 15 апреля 2010

В вашем AndroidManifest.xml добавьте этот атрибут в свою активность

android:configChanges="locale"

В вашей активности переопределить onConfigurationChanged()

@Override
public void onConfigurationChanged(Configuration newConfig) {
  // refresh your views here
  super.onConfigurationChanged(newConfig);
}

https://developer.android.com/guide/topics/manifest/activity-element.html#config

9 голосов
/ 30 июня 2012

Я думаю, что вопрос заключается в переключении языка во время выполнения приложения и отображении локализованных сообщений в пользовательском интерфейсе. android:configChanges="locale" вызывает onConfigurationChanged, если системный языковой стандарт изменяется (в настройках вашего устройства) во время работы приложения, а не если вы меняете языковой стандарт в коде для своего приложения, что, я полагаю, является тем, чего вы хотите достичь. Вот почему это не освежает.

7 голосов
/ 14 августа 2012

Вот метод, который я использую во время каждого действия onCreate () или onResume () в зависимости от моих потребностей (если моя деятельность будет возобновлена ​​после изменения пользователем языковых настроек или всегда будет создаваться с уже установленным языком):

Оттуда я просто обновляю представление вручную или из onConfigurationChanged (), который вызывается после завершения этого метода.

public static void changeLocale(Activity activity, String language)
{
    final Resources res = activity.getResources();
    final Configuration conf = res.getConfiguration();
    if (language == null || language.length() == 0)
    {
        conf.locale = Locale.getDefault();
    }
    else
    {
        final int idx = language.indexOf('-');
        if (idx != -1)
        {
            final String[] split = language.split("-");
            conf.locale = new Locale(split[0], split[1].substring(1));
        }
        else
        {
            conf.locale = new Locale(language);
        }
    }

    res.updateConfiguration(conf, null);
}
0 голосов
/ 16 декабря 2015

Предполагая, что вы меняете язык через что-то вроде

private void updateLocale(@NonNull final Context context,
                          @NonNull final Locale newLocale) {
    final Resources resources = context.getResources();
    final DisplayMetrics displayMetrics = resources.getDisplayMetrics();
    final Configuration configuration = resources.getConfiguration();
    configuration.locale = newLocale;
    resources.updateConfiguration(configuration, displayMetrics);
    Locale.setDefault(newLocale);
}

Вам нужно будет вызвать Activity.recreate () во всех открытых на данный момент действиях, что и будетесли пользователь изменил язык системы, пока вы не подписывались на android:configChanges="locale".

0 голосов
/ 03 июня 2015
public void settingLocale(Context context, String language) {

Locale locale;

Configuration config = new Configuration();

 if(language.equals(LANGUAGE_ENGLISH)) {

    locale = new Locale("en");

    Locale.setDefault(locale);

    config.locale = locale;

}else if(language.equals(LANGUAGE_ARABIC)){

    locale = new Locale("hi");

    Locale.setDefault(locale);

    config.locale = locale;

}

context.getResources().updateConfiguration(config, null);

// Here again set the text on view to reflect locale change

// and it will pick resource from new locale

tv1.setText(R.string.one); //tv1 is textview in my activity

}
0 голосов
/ 29 ноября 2011

Я не уверен, почему это не подобрано onConfigurationChanged().

Эй, Сандис, ты имеешь в виду, что метод onConfigurationChanged() не вызывал тебя в твоей деятельности, когда ты сменил язык? Я встретил ту же проблему. Проблема может быть в следующем: когда мы меняем язык, активность переходит на onDestroy() (вы можете попробовать это), поэтому некому звонить onConfigurationChanged(). Когда мы снова запускаем действие, вызывается onCreate(), а не onConfigurationChanged(). Там может быть что-то другое в изменении локали и ориентации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...