2010-04-15 25 views
23

Así que 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.Cambiar la configuración regional: ¿se fuerza la actividad para volver a cargar los recursos?

Una solución fea a mi problema sería hacer que cada vista de texto cargue los recursos nuevos cada vez que se cambia 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?

Respuesta

18

En su AndroidManifest.xml, añadir este atributo a su actividad

android:configChanges="locale" 

En su anulación actividad

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    // refresh your views here 
    super.onConfigurationChanged(newConfig); 
} 

https://developer.android.com/guide/topics/manifest/activity-element.html#config

+0

¿Se supone que esto se dispara cuando llamo a resource.updateConfiguration()? Actualmente no estoy teniendo éxito con la ejecución de onConfigurationChanged() para ejecutar. : '( – pgsandstrom

+1

onConfigurationChanged() debería activarse cuando se cambia el idioma. En realidad, solo mirando hacia atrás hay una señal de advertencia en su pregunta que me perdí la primera vez, "Tengo una configuración de idioma en mi aplicación". ¿Esto significa? ¿no está utilizando la función de configuración de idioma de todo el dispositivo Android? –

+1

¿No estoy seguro de lo que quieres decir? Pero sí uso la configuración regional del teléfono cuando la aplicación se inicia por primera vez, y tengo varios recursos marcados, por ejemplo, valores-en, valores-fr, valores-de etc. Todavía quiero que el usuario pueda tener mi aplicación en un idioma diferente que el teléfono. No sé por qué, pero algunos usuarios han solicitado esta característica. – pgsandstrom

0

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

Oye, sandis, ¿te refieres al método que no menciona 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 al onDestroy() (puede intentarlo), por lo que no hay nadie que llame al . Cuando lanzamos la actividad nuevamente, se llama al onCreate(), no al . Quizás haya algo diferente en el cambio de orientación y el cambio de ubicación.

+1

Realmente lo siento, es mi error: mi actividad es una actividad incrustada de una tabactividad, cuando agrego android: configChanges = "locale" a la tabactivity, funciona bien, no va a onDestroy() cuando cambia el idioma, y ​​lo hará llama aConfigurationChanged() en la tabactivity, pero este método no puede invocar la actividad incrustada. – himalayagiant

8

Creo que la pregunta es cambiar el idioma en tiempo de ejecución para la aplicación y mostrar los mensajes localizados en la interfaz de usuario. android:configChanges="locale" llama al onConfigurationChanged si se cambia la configuración regional 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.

6

Aquí es el método que utilizo durante cada actividad onCreate() o onResume() en función de mis necesidades (si mi actividad se reanudará cuando el usuario cambia la configuración de idioma o siempre será creado con el lenguaje ya establecido):

A partir de ahí, simplemente actualizo la vista manualmente o desde onConfigurationChanged() a la 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); 
} 
+0

gran pensamiento. un método para todas las actividades. – SMR

+1

¿Qué pasa si haces esto en un Fragmento? ¿Cómo refrescas el idioma de la configuración regional allí? –

+0

Respuesta perfecta Gracias @ 3c71 –

0
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 

} 
-1

Suponiendo que está 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 Activity.recreate() en todas las actividades abiertas en ese momento, que es lo que pasaría si el usuario ha cambiado el idioma del sistema mientras no se estaba suscribiendo al android:configChanges="locale".

+0

Una explicación para los votos a la baja sería muy apreciada. – Thorbear

Cuestiones relacionadas