2012-05-18 35 views
23
這裏

的Android文檔http://developer.android.com/guide/topics/resources/localization.html解釋,你可以得到當前的區域用這種方法:爲什麼Android有自己的方式來獲取當前的語言環境?

context.getResources().getConfiguration().locale 

看來的Java已經提供了這種方法的形式這樣的信息:

java.util.Locale.getDefault() 

爲啥Android開發人員引入了另一種獲取語言環境的方式?以上兩行代碼在同時並行運行時會產生不同的結果嗎?

回答

27

我同意這是令人困惑,雖然我不是攻擊它,也不是我捍衛它,我可以看到它允許你做一些事情。

讓我們從頭開始。

java.util.Locale.getDefault()由java運行時定義。這是電話/設備的語言環境。當沒有語言環境時,它就是像DateFormats(ISO Dateformat標準,美國格式標準等),NumberFormats(逗號或小數,3或4的分組等)和CurrenyFormats(看起來像是$或CAD)給出。對於這些情況,最好將Locale指定爲這些類型的對象。

context.getResources().getConfiguration().locale是在給定的上下文中使用當前資源包註冊的語言環境。它可以包含所有資源內容將尊重當前上下文/資源對的語言環境值。配置可以有點類似於最佳過濾到當前資源的設備的當前狀態。您不一定需要指定任何基於區域設置進行更改的內容,但這是一個選項。

資源在配置中使用一組鑑別器,如方向,屏幕寬度,區域設置等。因此,在您的應用程序中,您可以通過將區域設置應用程序配置更改爲不同的區域設置來允許重寫當前的Resources()。例如,您正在爲地址進行佈局。您可能希望某些字段根據所選國家/地區而變化。 (並不是說這對於這樣的應用程序來說是正確的行爲,但現在想想這是最簡單的事情)。如果您只需要依賴Locale.getDefault(),那麼當您想要按照剛剛描述的方式執行某些操作時,會導致系統應用程序和狀態的某些尷尬重置。

您基本上需要修改整個設備的區域設置(這不一定安全,也不是任何老用戶會喜歡的)。即使我們忽視了主機虛擬機重複出現的安全管理器問題,在大多數設備上,有很多狀態是針對國家/地區工具包緩存的。所以會有相當大的滯後,可能會有很多的不穩定性,同時切換這個值(如果任何人都可以這樣做)。另一種選擇是始終指定一切的語言環境。你可以看到會有多惱人。所以它在Context的配置中。

所以雖然很尷尬,但確實提供了額外的自由度和保護以及便利性。大多數情況下,它是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

相關問題