Detener o reiniciar completamente todas las actividades en una aplicación de Android para reflejar la nueva opción de idioma

Estoy trabajando en una aplicación de Android que debe ser bilingüe (inglés / español). Permito que el usuario seleccione el idioma deseado en una Preferencia y realice el siguiente cambio de configuración regional en la actividad principal de la aplicación (una subclase de TabActivity) en función del idioma seleccionado:

private void setApplicationLanguage(String languageCode) { // Set the locale to the specified language code. Resources res = getResources(); DisplayMetrics dm = res.getDisplayMetrics(); android.content.res.Configuration conf = res.getConfiguration(); conf.locale = new Locale(languageCode.toLowerCase()); res.updateConfiguration(conf, dm); } 

La actividad principal alberga cuatro pestañas, cada una con su propia actividad (a veces ActivityGroup). Lo que me gustaría que sucediera es cuando el idioma cambia, todas las actividades abiertas se reinician simplemente lo que hace que sus cadenas sean recargadas en el idioma apropiado. También aceptable (pero menos deseable) sería la destrucción total de todas las actividades abiertas, lo que requiere el usuario para iniciar la aplicación de nuevo manualmente y por lo tanto todas las cadenas se volverían a cargar en el idioma apropiado.

He intentado llamar a finish() de la actividad principal que hace que la actividad de salir. Sin embargo, al reiniciar la aplicación, las actividades secundarias "alojadas" por la actividad principal (una para cada ficha) siguen apareciendo en el idioma anterior. Supongo que esto es porque las actividades de los niños no eran recursivamente "terminado" para mí.

También he intentado incluir / excluir el atributo "locale" de AndroidManifest.xml en la actividad principal, así como otras actividades, pero nunca veo una actividad de reinicio tras un cambio en local. Entonces, ¿cómo se manifestaría el "reinicio"? ¿ onCreate() o simplemente onResume() , o incluso algo más? Si este enfoque automagically reiniciar las actividades, llamando onCreate() cuando cambia la configuración regional, entonces suena como orientación específica sobre cómo hacer que esto suceda sería la mejor ruta en mi caso.

La solución debe ejecutarse en Android API de nivel 7, por lo que la creación de una nueva Intent con la FLAG_ACTIVITY_CLEAR_TASK flag FLAG_ACTIVITY_CLEAR_TASK aparentemente no está disponible.

Puede utilizar un BroadcastReceiver como una clase interna de cada Activity utilizada para el contenido de la pestaña.

Registrar el receptor en onResume y onResume -registrarlo en onPause .

Haga que la Activity principal envíe una emisión "pegajosa" cuando cambie la configuración regional y utilice el resultado de registerReceiver en onResume para recuperar el Intent para ver si la configuración regional ha cambiado. Esto también debería funcionar para cualquier actividad 'visible' que le permita actualizar dinámicamente los datos.

Implementé un LocalBroadcastManager para informar a las partes interesadas sobre el cambio en la configuración regional. El problema era que no era capaz de actualizar todo lo que quería, por ejemplo, las etiquetas en las pestañas. Lo que resultó ser el mejor trabajo fue el siguiente en la actividad principal (Tab):

  Intent intent = new Intent(mainActivity.getApplicationContext(), MainTabActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); mainActivity.startActivity(intent); 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.