本文内容为原创,转载者请注明原始作者为seker,原始出处为http://blog.csdn.net/seker_xinjian/archive/2011/03/30/6288957.aspx. 以避免版权纠纷!

 

本文中涉及的代码所对应的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布局如下:

        /packages/apps/Settings/src/com/android/settings/LanguageSettings.java

        /packages/apps/Settings/res/xml/language_settings.xml

 

 

1、Settings -> Language & keyboard -> Select language

    在/packages/apps/Settings/res/xml/language_settings.xml中,该模块的Preference布局为:

 

    所以,当用户点击“Settings -> Language & keyboard -> Select language”时,将启动“com.android.settings.LocalePicker”的Activity。其对应的源代码为:

        /packages/apps/Settings/src/com/android/settings/LocalePicker.java

 

    LocalePicker Activity继承自ListActivity。在它的onCreate()回调中,调用了下面一条语句:

        String[] locales = getAssets().getLocales();  

 

    LocalePicker Activity将取得的locale字符串进行了一些处理,然后创建了ArrayAdapter adapter,并绑定到ListActivity的ListView上。当用户点击ListView上的Item时,再将选中的locale信息设置到Android系统中。

@Override protected void onListItemClick(ListView l, View v, int position, long id) { try { IActivityManager am = ActivityManagerNative.getDefault(); Configuration config = am.getConfiguration(); Loc loc = mLocales[position]; config.locale = loc.locale; // indicate this isn't some passing default - the user wants this remembered config.userSetLocale = true; am.updateConfiguration(config); // Trigger the dirty bit for the Settings Provider. BackupManager.dataChanged("com.android.providers.settings"); } catch (RemoteException e) { // Intentionally left blank } finish(); }  

2、Settings -> Language & keyboard -> Android keyboard [settings] -> Input languages

    在/packages/apps/Settings/res/xml/language_settings.xml中,找不到输入法相关的布局内容。但是,可以在/packages/apps/Settings/src/com/android/settings/LanguageSettings.java中找到一个onCreateIMM()函数,它在onCreate()回调中被调用。它的作用就是通过InputMethodManager类的getInputMethodList() API获得当前系统已安装的输入法列表,然后逐个地动态生成Preference布局,追加加到设置界面上。

 

    事实上,Gingerbread默认的有三种输入法:英文,中文,日文。对应的工程代码路径为:

        /packages/inputmethods/LatinIME/

        /packages/inputmethods/OpenWnn/

        /packages/inputmethods/PinyinIME/

 

    通过Log,可以发现,当点击 Android keyboard [settings] 菜单项时,将会启动一个Activity:com.android.inputmethod.latin/com.android.inputmethod.latin.LatinIMESettings。因此可以断定/packages/inputmethods/LatinIME/就是我们要找的Android keyboard [settings]输入法的源代码工程。

 

    通过/packages/inputmethods/LatinIME/java/AndroidManifest.xml,可以找到这个Activity和布局是:

        /packages/inputmethods/LatinIME/java/src/com/android/inputmethod/latin/LatinIMESettings.java

        /packages/inputmethods/LatinIME/java/res/xml/prefs.xml

 

    最后综合可以判定Settings -> Language & keyboard -> Android keyboard [settings] -> Input languages对应的代码是:

        /packages/inputmethods/LatinIME/java/src/.../latin/InputLanguageSelection.java

 

    InputLanguageSelection继承自PreferenceActivity,它有一个getUniqueLocales()函数,在这个函数中,它如同/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界面。

 

更多相关文章

  1. Android(安卓)基础知识
  2. 线性布局 LinearLayout
  3. android屏幕适配布局和字体
  4. Android(安卓)PendingIntent.getBroadcast intent数据不更新问题
  5. Android——View.inflate()的详细介绍
  6. Android实现的ListView分组布局改进示例
  7. Android应用开发——Activity组件
  8. Android(安卓)WebView 软键盘遮挡输入框问题的解决方法
  9. LayoutInflater的inflate方法使用

随机推荐

  1. Android 问题(一)
  2. android对话框的使用
  3. android的Material Design点击涟漪效果
  4. NoClassDefFoundError with Android Stud
  5. SDK下载地址
  6. Android(安卓)MMS 源码流程
  7. Android 修改Window属性
  8. 在线android
  9. Android 与JS互调
  10. android 6 sdk/ndk下载地址