2011-02-11 7 views
24

Ho un'applicazione Android con stringhe in inglese in valori/strings.xml. Per ogni stringa in quel file, ho una voce in values-ja/strings.xml con la traduzione giapponese di quella stringa. Se imposto l'emulatore, un Nexus One o Nexus S in giapponese, l'interfaccia utente mostra il testo giapponese in tutto. La maggior parte delle volte.Perché Resources.getString() potrebbe restituire a intermittenza le stringhe dalle impostazioni locali errate?

A volte, alcune parti dell'interfaccia utente vengono visualizzate in inglese, anche se la locale corrente è ja-JP. Per esempio, ho scritto questo codice di prova nel metodo onCreate() di una delle mie attività:

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

A volte mi vedrò in LogCat:

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

Altre volte mi vedrò:

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

A volte questo problema viene risolto ruotando il telefono. A volte è risolto uscendo e riavviando l'app. A volte solo una porzione di un singolo schermo è in inglese. A volte questo problema si verifica con le stringhe che vengono estratte dalle risorse tramite codice e talvolta si verifica con stringhe a cui viene fatto riferimento solo da un layout. Da nessuna parte nella mia applicazione chiamo Locale.setDefault(), quindi questo non causa il problema.

UPDATE

ho trovato un modo per correggere il problema per una specifica attività. In onCreate di quella attività():

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() + "'"); 

Il risultato è il seguente in 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}' 

Come si può vedere dal registro, nulla nelle modifiche alla configurazione attuale, ma getString() dà diverso risultati.

Non è pratico utilizzare questa soluzione alternativa in ogni punto della mia applicazione in cui è possibile utilizzare una risorsa, ma si spera che ciò fornisca un suggerimento su cosa non funziona.

+0

Hai provato il bug tracker di google android? http://code.google.com/p/android/issues/ –

+0

quale versione dell'AVD stai usando? – rockeye

+0

Ho esaminato tutti i difetti del bug tracker che contiene "lingua" o "locale". Non ho visto nessun altro che segnalasse questo problema. –

risposta

0

Si sta modificando Locale mentre l'applicazione è in esecuzione? In tal caso, hai implementato correttamente i vari elementi del ciclo di vita dell'Attività (compresi onSaveInstanceState() e onRestoreInstanceState())?

In base a http://developer.android.com/guide/topics/resources/runtime-changes.html, una modifica della configurazione in fase di esecuzione dovrebbe causare il riavvio dell'attività. &. Sembra che la tua app stia rilevando la nuova configurazione ma non si riavvii correttamente (fino al riavvio dell'intera App o alla modifica dell'orientamento).

Stai facendo qualcosa di strano in onSaveInstanceState o onDestroy?

P.s Se si corregge da solo solo su alcune modifiche di orientamento, puoi consigliare se quelle modifiche all'orientamento si verificano su layout che hanno file di layout orizzontali verticali diversi &?

+0

Anch'io ero preoccupato per il ciclo di vita delle attività. Ho inserito le istruzioni Log.e() su ogni onCreate() e onDestroy(). Quando cambi lingua nelle impostazioni, il sistema operativo distrugge e ricrea automaticamente le tue attività. Nessuna delle nostre implementazioni onSaveInstanceState() fa nulla tranne una che salva un file di registro locale. –

+0

A proposito del ciclo di vita, l'applicazione contiene sia codice nativo che servizio in background. Non credo che questi dovrebbero influenzare le risorse, però. –

+0

L'applicazione non dichiara alcuna clausola android: configChanges in AndroidManifest.xml, quindi la gestione delle modifiche di configurazione è automatica. L'applicazione non ha file di layout diversi per diversi orientamenti. –

1

Questa è solo una teoria ma you could be leaking a Context. Fondamentalmente, la vecchia attività potrebbe riportare i valori di stringa anziché quelli appena creati.

Un modo per verificare questo è: (! Non è statico)

  1. Change TAG a una variabile membro.
  2. OnCreate, imposta TAG = this.toString(), questo inserirà l'indirizzo di memoria dell'attività come tag.
  3. Fare stampare l'attività utilizzando le impostazioni internazionali iniziali.
  4. Fai qualsiasi cosa per cambiare la locale. Questo dovrebbe (mai verificato questo) riavviare l'attività e si ottiene una nuova attività. Se fate. Allora guarda il log e vedi se l'indirizzo di memoria sta cambiando per il tag. Se l'indirizzo di memoria è lo stesso di prima che il contesto fosse trapelato.
+0

Ho provato un metodo leggermente diverso: inserisco un punto di interruzione nella chiamata getString() che si trova nel metodo onCreate() di un'attività. Guardo il valore di questo, che è l'attività (che è anche il contesto). È diverso ogni volta. Non penso che questa sia la causa del problema. –

Problemi correlati