2015-09-08 8 views
5

So fand ich heraus, dass es zwei Ansätze Systems locale in Android zu bekommen:Android get system locale unterschiedliche Ansätze

Locale.getDefault() 

Und

getResources().getConfiguration().locale 

Grundsätzlich Frage ist - kann die Ausgabe für diese unterscheiden zwei? Oder sind sie immer die gleichen und ich kann die erste verwenden, da es Context Objekt nicht erfordert?

Antwort

1

von this page: Zitat

des Standardgebietsschemas seiner

vorsichtig

Hinweis, dass es viele Methoden verwendet, die automatisch das Standardgebietsschema verwenden, jedoch unter Verwendung von Sie können zu kleinen Fehlern führen.

Das Standardgebietsschema ist für Aufgaben angemessen, die Daten für den Benutzer beinhalten präsentiert. In diesem Fall möchten Sie die Datums-/Uhrzeitformate des Benutzers, Zahlenformate, Regeln für die Umwandlung in Kleinbuchstaben usw. verwenden. In diesem Fall ist es sicher, die Bequemlichkeitsmethoden zu verwenden.

das Standardgebietsschema ist für maschinenlesbare Ausgabe nicht geeignet sind. Die beste Wahl dort ist normalerweise Locale.US - dieses Gebietsschema ist garantiert, auf allen Geräten verfügbar zu sein, und die Tatsache, dass es keine überraschenden Sonderfälle hat und häufig verwendet wird (besonders für die Computer-Computer-Kommunikation) bedeutet, dass es das ist effizienteste Wahl auch.

Ein häufiger Fehler ist die implizite Verwendung des Standardgebietsschemas beim Erstellen von Ausgaben, die maschinenlesbar sein sollen. Dies funktioniert auf den Testgeräten des Entwicklers (vor allem, weil so viele Entwickler en_US verwenden), scheitert jedoch, wenn es auf einem Gerät ausgeführt wird, dessen Benutzer sich in einem komplexeren Gebietsschema befindet.

Wenn Sie beispielsweise Ganzzahlen formatieren, verwenden einige Gebietsschemas Nicht-ASCII-Dezimalziffern. Wenn Sie zum Beispiel Fließkommazahlen formatieren, verwenden einige Gebietsschemas ',' als Dezimalzeichen und '.' für Zifferngruppierung. Das ist korrekt für eine menschenlesbare Ausgabe, verursacht aber wahrscheinlich Probleme, wenn sie einem anderen Computer präsentiert wird (parseDouble (String) kann beispielsweise eine solche Zahl nicht analysieren). Sie sollten auch vor den Überladungen toLowerCase() und toUpperCase() auf der Hut sein, die kein Gebietsschema verwenden: In der Türkei beispielsweise werden die Zeichen "i" und "I" nicht in "I" und "i" umgewandelt ". Dies ist das korrekte Verhalten für türkischen Text (wie Benutzereingabe), aber ungeeignet für, sagen wir, HTTP-Header.

1

Locale current = GetResources() getConfiguration() locale..;

Sie können feststellen, dass dieser Wert mehr aktualisiert wird schnell nach einer Einstellung, wenn das ändert für Ihre Anwendung erforderlich ist.

Was nicht in Ihrer anderen Methode ist

0

AFAIK, können Sie entweder, es sei denn, Ihre Anwendung selbst mit locale Stampfer eine Möglichkeit verwenden, aber nicht die andere (Locale.setDefault() aber nicht config.locale oder umgekehrt)

Hier ist der Grund:

ResourcesManager.applyConfigurationToResourcesLocked() #275:

public final boolean applyConfigurationToResourcesLocked(Configuration config, 
     CompatibilityInfo compat) 
    ... 

    // set it for java, this also affects newly created Resources 
    if (config.locale != null) { 
     Locale.setDefault(config.locale); 
    } 

    Resources.updateSystemConfiguration(config, defaultDisplayMetrics, compat); 
    ApplicationPackageManager.configurationChanged(); 
    ...