1. 程式人生 > >Android的語言設定(一)

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介面。