Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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".