2012-05-18 8 views
23

Androidのドキュメントhttp://developer.android.com/guide/topics/resources/localization.htmlは、あなたがこの方法で、現在のロケールを得ることができることを説明していますAndroidに現在のロケールを取得する独自の方法があるのはなぜですか?ここ

context.getResources().getConfiguration().locale 

Javaがすでにこのメソッドの形式で情報を提供しているようだ:

java.util.Locale.getDefault() 

そのようにした理由Androidデベロッパーはロケールを入手する別の方法を紹介していますか?同時に2つのコードを同時に実行すると、異なる2つのコードが生成されるのでしょうか?

答えて

27

私はそれが混乱していると私はそれを攻撃していないと私はそれを守っている間に私はあなたがいくつかのことを行うことができますそれを見ることができることに同意する。

最初から始めましょう。

java.util.Locale.getDefault()は、Javaランタイムによって定義されます。これは、電話機/デバイスのロケールです。ロケールがない場合は、DateFormats(ISO Dateformat標準、米国標準規格など)、NumberFormats(カンマまたは小数点、3または4などのグループ化)、CurrenyFormats($またはCADのように見えます)与えられた。これらの場合は、おそらく、これらのタイプのオブジェクトにロケールを指定することをお勧めします。

context.getResources().getConfiguration().localeは、指定されたコンテキストで現在のリソースパックに登録されているロケールです。現在のコンテキスト/リソースのペアについて、すべてのリソースコンテンツが尊重するロケール値を含めることができます。この構成は、現在のリソースに最もよくフィルタリングされたデバイスの現在の状態のようなものにすることができます。ロケールに基づいて変更されるコンテンツは必ずしも指定する必要はありませんが、オプションです。

リソースは、向き、画面の幅、ロケールなどのような設定でディスクリミネータのセットを使用します。したがって、ロケールアプリの設定を別のロケールに変更するだけで、現在のResources()を別のもので上書きすることができます。たとえば、あなたは住所用のレイアウトを作成していました。国の選択に応じて、特定のフィールドを変形することができます。 (これは、このようなアプリでは正しい動作ではありませんが、今のところ考えるのが最も簡単です)。 Locale.getDefault()に単純に頼らざるを得なかった場合は、ちょうど私が説明したような何かをしたいときにシステムアプリケーションと状態のいくつかの厄介なリセットのためになります。

デバイス全体のロケールを変更する必要があります(これは必ずしも安全ではなく、古いユーザーが楽しめるものでもありません)。ホストVMによって複製されるセキュリティマネージャの問題を無視しても、ほとんどのデバイスには、国のキットのためにキャッシュされている多くの状態があります。したがって、この値を(誰かがそれを行うことができれば)切り替えていくうちに、か​​なりの遅れとおそらく多くの不安定さがあります。もう1つの選択肢は、常にすべてのロケールを指定することです。あなたはそれがいかに迷惑であるかを見ることができました。これは、コンテキストの設定内にあります。

これは扱いにくいものの、余分な自由度と保護と利便性を提供します。ほとんどの場合、アプリケーションがLocale.getDefault()に初期化されたプロセスから開始されたので、Locale.getDefault()になります。一般的に私はLocale.getDefault()の値をあまり使わないことを躊躇しています。消費者向けのアプリケーション開発には、それが信頼されるべきものになるにはあまりにも多くの時間はありません。

私はOSデベロッパーではないので、実際には、これは主にシステムの賛否両論を分析しているからです。私は設定のロケールが完全に妥当だと思う。

+0

アドレスレイアウトに別のロケールを使用することは、使用例の素晴らしい例です。 – Wernight

+1

APIレベル24で 'getConfiguration()。locale'が[廃止予定](https://developer.android.com/reference/android/content/res/Configuration.html#locale)だったので、[現在はもう少し冗長である](http://stackoverflow.com/q/38267213/56285)。 – Jonik

関連する問題