Изменение языка: активировать активность для перезагрузки ресурсов?

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

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

Ответ 1

В вашем 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

Ответ 2

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

Ответ 3

Вот метод, который я использую во время каждого действия 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);
}

Ответ 4

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

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

Ответ 5

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

}

Ответ 6

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

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".