Android的語言設定(一)
本文中涉及的程式碼所對應的Android Source版本為2.3.3,代號Gingerbread.
這兩天在調查Android系統Setting程式中對於語言設定這塊的內容。具體位置有以下兩處:
1)、設定顯示語言:Settings -> Language & keyboard -> Select language
2)、設定輸入語言:Settings -> Language & keyboard -> Android keyboard [settings] -> Input languages
Settings工程中,Settings -> Language & keyboard介面所對應的Java程式碼和Preference佈局如下:
<android_root>/packages/apps/Settings/src/com/android/settings/LanguageSettings.java
<android_root>/packages/apps/Settings/res/xml/language_settings.xml
1、Settings -> Language & keyboard -> Select language
在<android_root>/packages/apps/Settings/res/xml/language_settings.xml中,該模組的Preference佈局為:
所以,當用戶點選“Settings -> Language & keyboard -> Select language”時,將啟動“com.android.settings.LocalePicker”的Activity。其對應的原始碼為:
<android_root>/packages/apps/Settings/src/com/android/settings/LocalePicker.java
LocalePicker Activity繼承自ListActivity。在它的onCreate()回撥中,呼叫了下面一條語句:
String[] locales = getAssets().getLocales();
LocalePicker Activity將取得的locale字串進行了一些處理,然後建立了ArrayAdapter<Loc> adapter,並繫結到ListActivity的ListView上。當用戶點選ListView上的Item時,再將選中的locale資訊設定到Android系統中。
2、Settings -> Language & keyboard -> Android keyboard [settings] -> Input languages
在<android_root>/packages/apps/Settings/res/xml/language_settings.xml中,找不到輸入法相關的佈局內容。但是,可以在<android_root>/packages/apps/Settings/src/com/android/settings/LanguageSettings.java中找到一個onCreateIMM()函式,它在onCreate()回撥中被呼叫。它的作用就是通過InputMethodManager類的getInputMethodList() API獲得當前系統已安裝的輸入法列表,然後逐個地動態生成Preference佈局,追加加到設定介面上。
事實上,Gingerbread預設的有三種輸入法:英文,中文,日文。對應的工程程式碼路徑為:
<android_root>/packages/inputmethods/LatinIME/
<android_root>/packages/inputmethods/OpenWnn/
<android_root>/packages/inputmethods/PinyinIME/
通過Log,可以發現,當點選 Android keyboard [settings] 選單項時,將會啟動一個Activity:com.android.inputmethod.latin/com.android.inputmethod.latin.LatinIMESettings。因此可以斷定<android_root>/packages/inputmethods/LatinIME/就是我們要找的Android keyboard [settings]輸入法的原始碼工程。
通過<android_root>/packages/inputmethods/LatinIME/java/AndroidManifest.xml,可以找到這個Activity和佈局是:
<android_root>/packages/inputmethods/LatinIME/java/src/com/android/inputmethod/latin/LatinIMESettings.java
<android_root>/packages/inputmethods/LatinIME/java/res/xml/prefs.xml
最後綜合可以判定Settings -> Language & keyboard -> Android keyboard [settings] -> Input languages對應的程式碼是:
<android_root>/packages/inputmethods/LatinIME/java/src/.../latin/InputLanguageSelection.java
InputLanguageSelection繼承自PreferenceActivity,它有一個getUniqueLocales()函式,在這個函式中,它如同<android_root>/packages/apps/Settings/src/com/android/settings/LocalePicker.java一樣,呼叫了下面的語句:
String[] locales = getAssets().getLocales();
然後InputLanguageSelection Activity將取得的locale字串進行了一些處理,然後迴圈最終的Locale列表,逐個的為每種語言動態生成CheckBoxPreference載入到InputLanguageSelection的畫面上。當用戶選中語言,退出InputLanguageSelection Activity時,這些選中的語言就會被儲存到SharedPreferences中去。
到此,可以看到以上這兩處的做法都是使用Activity的getAssets()方法取得AssetManager的例項,然後呼叫AssetManager的getLocales()函式取得系統所支援的語言。然後經過自己的一些過濾辦法,最終顯示在UI介面。