2011-02-11 9 views
24

Tengo una aplicación de Android con cadenas en inglés en values ​​/ strings.xml. Para cada cadena en ese archivo, tengo una entrada en valores-ja/strings.xml con la traducción al japonés de esa cadena. Si configuro el emulador, un Nexus One o un Nexus S en japonés, la interfaz de usuario muestra texto en japonés en todas partes. La mayor parte del tiempo¿Por qué Resources.getString() devolver cadenas de manera intermitente desde la configuración incorrecta?

A veces, parte de la IU aparecerá en inglés, aunque la configuración actual sea ja-JP. Por ejemplo, he escrito este código de prueba en el método onCreate() de una de mis actividades:

Log.e(TAG, "Default locale = '" + Locale.getDefault().toString() + "'"); 
Log.e(TAG, "My string = '" + getResources().getString(R.string.my_string) + "'"); 

veces voy a ver en LogCat:

Default locale is 'ja_JP' 
My string is '日本' 

Otras veces voy a ver:

Default locale is 'ja_JP' 
My string is 'English' 

A veces, este problema se resuelve girando el teléfono. A veces se resuelve saliendo y reiniciando la aplicación. A veces, solo una parte de una sola pantalla está en inglés. A veces, este problema se produce con cadenas que se extraen de los recursos mediante código y, a veces, se produce con cadenas a las que solo hace referencia un diseño. En ninguna parte de mi aplicación llamo a Locale.setDefault(), así que eso no está causando el problema.

ACTUALIZACIÓN

he encontrado una manera de corregir el problema para una actividad específica. En onCreate de que la actividad():

Log.e(TAG, "getString: '" + getString(R.string.my_string) + "'"); 
Log.e(TAG, "getResources().getConfiguration(): '" + 
     getResources().getConfiguration().toString() + "'"); 
Log.e(TAG, "getResources().getDisplayMetrics(): '" + 
     getResources().getDisplayMetrics().toString() + "'"); 

Log.e(TAG, "Setting configuration to getConfiguration()"); 
getResources().updateConfiguration(getResources().getConfiguration(), 
    getResources().getDisplayMetrics()); 

Log.e(TAG, "getString: '" + getString(R.string.my_string) + "'"); 
Log.e(TAG, "getResources().getConfiguration(): '" + 
     getResources().getConfiguration().toString() + "'"); 
Log.e(TAG, "getResources().getDisplayMetrics(): '" + 
     getResources().getDisplayMetrics().toString() + "'"); 

Esto se traduce en lo siguiente en LogCat:

getString: 'English' 
getResources().getConfiguration(): '{ scale=1.0 imsi=0/0 loc=ja_JP touch=3 keys=1/1/2 nav=3/1 orien=1 layout=34 uiMode=17 seq=8}' 
getResources().getDisplayMetrics(): 'DisplayMetrics{density=1.5, width=480, height=800, scaledDensity=1.5, xdpi=254.0, ydpi=254.0}' 
Setting configuration to getConfiguration() 
getString: '日本' 
getResources().getConfiguration(): '{ scale=1.0 imsi=0/0 loc=ja_JP touch=3 keys=1/1/2 nav=3/1 orien=1 layout=34 uiMode=17 seq=8}' 
getResources().getDisplayMetrics(): 'DisplayMetrics{density=1.5, width=480, height=800, scaledDensity=1.5, xdpi=254.0, ydpi=254.0}' 

Como se puede ver en el registro, no hay nada en los cambios de configuración actuales, pero getString() da diferentes resultados.

No es práctico utilizar esta solución en todos los lugares de mi aplicación donde se podría usar un recurso, pero espero que esto proporcione una pista sobre lo que está pasando mal.

+0

¿Has probado el rastreador de fallas de google android? http://code.google.com/p/android/issues/ –

+0

¿qué versión de AVD estás usando? – rockeye

+0

Revisé cada defecto en el rastreador de errores que contiene "idioma" o "configuración regional". No vi a nadie más informando este problema. –

Respuesta

0

¿Está cambiando la configuración regional mientras se ejecuta la aplicación? De ser así, ¿ha implementado correctamente los diversos elementos del ciclo de vida de la actividad (incluidos onSaveInstanceState() y onRestoreInstanceState())?

De acuerdo con http://developer.android.com/guide/topics/resources/runtime-changes.html, un cambio en la configuración en tiempo de ejecución debería provocar la destrucción de la actividad & reiniciada. Parece que su aplicación está notando la nueva configuración, pero no se está reiniciando correctamente (hasta que reinicie toda la aplicación o cambie de orientación).

¿Estás haciendo algo funky en onSaveInstanceState o onDestroy?

P.s. Si se corrige solo en ciertos cambios de orientación, ¿puede avisar si esos cambios de orientación ocurren en diseños que tienen diferentes archivos de diseño horizontal &?

+0

También me preocupaba el ciclo de vida de la actividad. Puse declaraciones Log.e() en cada onCreate() y onDestroy(). Cuando cambia el idioma en la configuración, el sistema operativo destruye y vuelve a crear sus actividades automáticamente. Ninguna de nuestras implementaciones onSaveInstanceState() hace nada excepto una que guarda un archivo de registro local. –

+0

Hablando de ciclo de vida, la aplicación contiene tanto código nativo como un servicio en segundo plano. Sin embargo, no creo que estos afecten los recursos. –

+0

La aplicación no declara ninguna cláusula android: configChanges en AndroidManifest.xml, por lo que el manejo de los cambios de configuración es automático. La aplicación no tiene diferentes archivos de diseño para diferentes orientaciones. –

1

Esto es sólo una teoría, pero you could be leaking a Context. Básicamente, la actividad anterior podría estar informando los valores de cadena en lugar de la recién creada.

Una manera de probar esto es: (! No es estático)

  1. Cambiar etiqueta a una variable miembro.
  2. OnCreate, establezca TAG = this.toString(), esto pondrá la dirección de memoria de la actividad como la etiqueta.
  3. Haga que la actividad imprima cosas utilizando la configuración regional inicial.
  4. Haga lo que sea para cambiar la configuración regional. Esto debería (nunca verificado) reiniciar la actividad y obtener una nueva actividad. Si lo haces. Mire el registro y vea si la dirección de memoria está cambiando para la etiqueta. Si la dirección de memoria es la misma que antes el contexto se filtró.
+0

Intenté con un método ligeramente diferente: puse un punto de interrupción en la llamada a getString() que está en el método onCreate() de una actividad. Miro el valor de esto, que es la Actividad (que también es el contexto). Es diferente cada vez. No creo que esta sea la causa del problema. –

Cuestiones relacionadas