2012-05-18 15 views
23
documentación

El androide aquí http://developer.android.com/guide/topics/resources/localization.html explica que se puede obtener la localización actual con este método:¿Por qué Android tiene su propia forma de obtener la configuración regional actual?

context.getResources().getConfiguration().locale 

Parece Java ya proporciona esta información en la forma de este método:

java.util.Locale.getDefault() 

Así que ¿por qué los desarrolladores de Android presentan otra forma de obtener la configuración regional ¿Las dos líneas de código anteriores alguna vez producirán resultados diferentes cuando se corren una al lado de la otra al mismo tiempo?

Respuesta

27

Estoy de acuerdo en que es confuso y, aunque no lo estoy atacando ni lo estoy defendiendo, lo veo permitiéndote hacer algunas cosas.

Comencemos desde el principio.

java.util.Locale.getDefault() está definido por el tiempo de ejecución java. Es la configuración regional del teléfono/dispositivo. Es lo que potencia cosas como DateFormats (formato ISO Dateformat, estándar de formato US, etc.), NumberFormats (comas o decimales, agrupaciones de 3 o 4, etc.) y CurrenyFormats (¿Se ve como $ o CAD?) Cuando no hay configuración regional dado. Para estos casos, probablemente sea mejor especificar la configuración regional para estos tipos de objetos de todos modos.

context.getResources().getConfiguration().locale es la configuración regional que se registra con el paquete de recursos actual en el contexto dado. Puede incluir el valor local que todo el contenido del recurso respetará para el par de contexto/recursos actual. La configuración puede ser algo así como el estado actual del dispositivo que mejor se filtró a los recursos actuales. No es necesario que especifique ningún contenido que cambie según la configuración regional, pero es una opción.

Los recursos usan un conjunto de discriminadores en Configuración como orientación, ancho de pantalla, configuración regional, etc. Así que dentro de su aplicación puede permitir reemplazar los Recursos actuales() con otros simplemente cambiando la configuración de la aplicación local a otra configuración regional. Como por ejemplo, estabas haciendo un diseño para una dirección. Es posible que desee que ciertos campos cambien según el país seleccionado. (No digo que este sea el comportamiento correcto para una aplicación de este tipo, pero es lo más simple de pensar en este momento). Si tuviera que simplemente confiar en Locale.getDefault(), sería un poco incómodo restablecer las aplicaciones del sistema y el estado cuando quisiera hacer algo como lo acabo de describir.

En esencia, se le solicitará que modifique la configuración regional para todo el dispositivo (esto no es necesariamente seguro, ni es algo que un usuario viejo pueda disfrutar). Incluso si ignoramos los problemas del administrador de seguridad que duplicaría el host vm; en la mayoría de los dispositivos, hay una gran cantidad de estados almacenados en caché para el kit de país. Por lo tanto, habría considerable retraso y probablemente mucha inestabilidad al cambiar este valor (si alguien puede hacerlo). La otra alternativa sería especificar siempre la configuración regional para todo. Podrías ver lo molesto que sería. Entonces está dentro de la Configuración del Contexto.

Por lo tanto, aunque es incómodo, proporciona un grado adicional de libertad y protección, y conveniencia. La mayoría de las veces será Locale.getDefault() dado que su Aplicación se inició desde un proceso cuyo contexto base se inicializó en Locale.getDefault(). En general, evitaría usar demasiado el valor de Locale.getDefault(). No hay demasiadas veces en el desarrollo de aplicaciones para el consumidor cuando sería algo en lo que se debería confiar.

Una vez más, no estoy basado en hechos, ya que no soy un desarrollador de sistema operativo, basándome principalmente en analizar los pros y los contras del sistema. Creo que la configuración regional es completamente razonable.

+0

El uso de otra configuración regional para un diseño de dirección es un gran ejemplo de caso de uso. – Wernight

+1

Dado que 'getConfiguration(). Locale' estaba [en desuso] (https://developer.android.com/reference/android/content/res/Configuration.html#locale) en el nivel de API 24, la forma recomendada [ahora parece ser un poco más prolijo] (http://stackoverflow.com/q/38267213/56285). – Jonik

Cuestiones relacionadas