2012-05-18 13 views
23

L'Android documentazione qui http://developer.android.com/guide/topics/resources/localization.html spiega che è possibile ottenere la locale corrente con questo metodo:Perché Android ha il proprio modo di ottenere le impostazioni locali correnti?

context.getResources().getConfiguration().locale 

Sembra Java fornisce già queste informazioni in forma di questo metodo:

java.util.Locale.getDefault() 

Allora perché gli sviluppatori Android introducono un altro modo per ottenere il locale? Le due righe di codice di cui sopra produrranno mai risultati diversi quando si eseguono parallelamente allo stesso tempo?

risposta

27

Sono d'accordo che è confuso e mentre non sto attaccando né sto difendendolo, posso vederlo permettendoti di fare alcune cose.

Iniziamo dall'inizio.

java.util.Locale.getDefault() è definito dal runtime java. È la locale del telefono/dispositivo. È ciò che alimenta cose come DateFormats (ISO Dateformat standard, standard di formato USA, ecc.), NumberFormats (virgola o decimali, raggruppamenti di 3 o 4, ecc.) E CurrenyFormats (Sembra un $ o un CAD) quando nessuna localizzazione è dato. Per questi casi è probabilmente meglio specificare le impostazioni internazionali per questi tipi di oggetti comunque.

context.getResources().getConfiguration().locale è l'impostazione internazionale registrata con il pacchetto di risorse corrente nel contesto specificato. Può includere il valore locale che rispetterà il contenuto della risorsa per la coppia di contesto/risorse corrente. La configurazione può essere simile allo stato corrente del dispositivo che è stato meglio filtrato alle risorse attuali. Non è necessario specificare alcun contenuto che cambia in base alle impostazioni locali, ma è un'opzione.

Le risorse utilizzano un set di discriminatori nell'orientamento della Configurazione, nella larghezza dello schermo, nelle impostazioni internazionali, ecc. Pertanto, all'interno dell'applicazione è possibile sovrascrivere le risorse correnti() con un'altra semplicemente cambiando la configurazione dell'app locale in una diversa locale. Ad esempio, stavi creando un layout per un indirizzo. Potresti volere che determinati campi si trasformino a seconda di quale sia il Paese selezionato. (Non dire che questo è un comportamento corretto per una tale app, ma è la cosa più semplice da pensare al momento). Se dovessi semplicemente fare affidamento su Locale.getDefault(), farebbe un po 'di reimpostazione delle app di sistema e stabilirò quando vuoi fare qualcosa come ho appena descritto.

In linea di principio, sarà necessario modificare le impostazioni internazionali per l'intero dispositivo (questo non è necessariamente sicuro, e non è qualcosa che piacerebbe a un vecchio utente). Anche se ignoriamo i problemi del gestore della sicurezza che verrebbero duplicati dall'host vm; sulla maggior parte dei dispositivi c'è molto stato che viene memorizzato nella cache per il kit del paese. Quindi ci sarebbe un ritardo considerevole e probabilmente molta instabilità mentre si cambia questo valore (se qualcuno potrebbe farlo). L'altra alternativa dovrebbe essere sempre specificare la locale per tutto. Potresti vedere quanto sarebbe fastidioso. Quindi è all'interno della configurazione del contesto.

Così mentre è scomodo, fornisce un ulteriore grado di libertà e protezione e convenienza. La maggior parte delle volte sarà Locale.getDefault() poiché l'applicazione è stata avviata da un processo il cui contesto di base è stato inizializzato in Locale.getDefault(). In generale, eviterei di usare troppo il valore Locale.getDefault(). Non ci sono troppe volte nello sviluppo di app consumer quando sarebbe qualcosa di cui ci si dovrebbe fidare.

Anche in questo caso non basato sul fatto poiché non sono un dev di sistema operativo, solo per lo più basato sull'analisi dei pro e dei contro del sistema. Penso che le impostazioni locali nella configurazione siano completamente ragionevoli.

+0

L'utilizzo di un'altra impostazione internazionale per un layout di indirizzo è un ottimo esempio di caso d'uso. – Wernight

+1

Poiché 'getConfiguration(). Locale' era [deprecato] (https://developer.android.com/reference/android/content/res/Configuration.html#locale) in livello API 24, il modo consigliato [ora sembra essere un po 'più prolisso] (http://stackoverflow.com/q/38267213/56285). – Jonik

Problemi correlati