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

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

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

В 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

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

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

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

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

 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 } 

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

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