Cambiar la configuración regional: ¿se fuerza la actividad para volver a cargar los recursos?

Entonces tengo una configuración de idioma en mi aplicación. Cuando se cambia el idioma, me gustaría que todas las textviews, etc. cambien de idioma de inmediato. Actualmente solo cambio la configuración regional en la configuración, por lo que el idioma ha cambiado cuando el usuario reinicia la actividad.

Una solución fea para mi problema sería hacer que cada vista de texto cargue los nuevos recursos cada vez que se modifique el idioma. ¿Hay una mejor solución? ¿Quizás una buena manera de reiniciar discretamente la actividad? ¿O tal vez simplemente forzar la recarga de los recursos?

En su AndroidManifest.xml, agregue este atributo a su Actividad

android:configChanges="locale" 

En su actividad, anule 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

Creo que la pregunta es cambiar el idioma en tiempo de ejecución para la aplicación y mostrar mensajes localizados en la interfaz de usuario. android:configChanges="locale" llama onConfigurationChanged si se cambia la configuración del sistema (en la configuración de su dispositivo) mientras se ejecuta la aplicación, y no si cambia la configuración regional en el código de su aplicación, que supongo que es lo que quiere lograr . Es por eso que no es refrescante.

Este es el método que uso durante cada actividad onCreate () o onResume () según mis necesidades (si mi actividad se reanudará después de que el usuario haya cambiado la configuración del idioma o siempre se creará con el idioma ya configurado):

A partir de ahí, solo actualizo la vista manualmente o desde onConfigurationChanged () que se llama después de que este método finaliza.

 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); } 

No estoy seguro de por qué esto no es recogido por onConfigurationChanged() .

Oye, sandis, ¿te refieres a que el método onConfigurationChanged() no onConfigurationChanged() tu actividad cuando cambiaste el idioma? Me encontré con el mismo problema. El problema puede ser el siguiente: cuando cambiamos el idioma, la actividad va a onDestroy() (puede probar esto), por lo que no hay nadie a quien llamar onConfigurationChanged() . Cuando lanzamos la actividad nuevamente, se llama a onCreate() , no a onConfigurationChanged() . Quizás haya algo diferente en el cambio de orientación y el cambio de ubicación.

 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 } 

Asumiendo que estás cambiando el idioma a través de algo así como

 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); } 

Tendrá que llamar a Activity.recreate () en todas las actividades actualmente abiertas, que es lo que sucedería si el usuario cambia el idioma del sistema mientras no se estaba suscribiendo a android:configChanges="locale" .