android - getresources - ¿Por qué podría Resources.getString() devolver cadenas de forma intermitente desde la configuración regional incorrecta?
string array android (2)
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 values-ja / strings.xml con la traducción japonesa de esa cadena. Si configuro el emulador, un Nexus One o Nexus S en japonés, la interfaz de usuario muestra el texto en japonés en todas partes. La mayor parte del tiempo.
A veces, una parte de la interfaz de usuario aparecerá en inglés, aunque la ubicación actual es ja-JP. Por ejemplo, escribí 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) + "''");
A veces lo veré en LogCat:
Default locale is ''ja_JP''
My string is ''日本''
Otras veces veré:
Default locale is ''ja_JP''
My string is ''English''
A veces este problema se resuelve girando el teléfono. A veces se resuelve al salir y reiniciar 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 a través del 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 (), por lo que no está causando el problema.
ACTUALIZAR
He encontrado una manera de corregir el problema para una actividad específica. En la actividad de onCreate ():
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 resulta 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 puede ver en el registro, nada en la configuración actual cambia, pero getString () da resultados diferentes.
No es práctico utilizar esta solución en todos los lugares de mi aplicación donde se pueda usar un recurso, pero espero que esto proporcione una pista sobre lo que está mal.
¿Está cambiando la configuración regional mientras se está ejecutando la aplicación? Si es 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 causar que la Actividad se destruya y reinicie. Parece que su aplicación está notando la nueva configuración pero que no se reinicia correctamente (hasta que se reinicia toda la aplicación o se cambia la orientación).
¿Estás haciendo algo funky en onSaveInstanceState
o onDestroy
?
P Si se corrige solo en ciertos cambios de orientación, ¿puede recomendarme si esos cambios de orientación ocurren en diseños que tienen diferentes archivos de diseño vertical y horizontal?
Esto es solo una teoría, pero podría estar filtrando un contexto. Básicamente, la actividad anterior podría estar informando los valores de cadena en lugar de los recién creados.
Una forma de probar esto es:
- Cambiar TAG a una variable miembro (¡NO ESTÁTICA!).
- OnCreate, establece TAG = this.toString (), esto colocará la dirección de memoria de la actividad como la etiqueta.
- Haga que la actividad imprima cosas utilizando la configuración regional inicial.
- Haz lo que sea para cambiar el local. Esto debería (nunca verificado esto) reiniciar la actividad y obtendrá una nueva actividad. Si lo haces. Luego mire el registro y vea si la dirección de la memoria está cambiando para la etiqueta. Si la dirección de la memoria es la misma que antes, se filtró el contexto.