Android inputmethod

== Android输入法的切换

IME APP通过Subtype的android:imeSubtypeLocale属性描述输入法所支持的locale。当系统语言发生切换的时候,系统locale随之发生变化。 InputMethodManagerService 通过监听Intent.ACTION_LOCALE_CHANGED广播,根据当前系统的locale来更新系统的默认输入法。

在IME APP中可以在资源中指定im_is_default的值,来告知 InputMethodManagerService 本应用是否可以作为某个locale的默认应用。 比如在LatinIME中,im_is_default的配置如下:

java/res/values-nl-rBE/bools.xml:21:    <bool name="im_is_default">true</bool>
java/res/values-it/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-cs/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-tr/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-tl/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-ar/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-es/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-hu/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-lv/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-zu/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-in/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-eo/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-nl/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-ro/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-fr/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-da/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-iw/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-hi/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-sk/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-lt/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-el/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-ca/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-bg/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-fi/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-nb/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-sl/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-ms/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-sv/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values/bools.xml:23:           <bool name="im_is_default">false</bool>
java/res/values-de/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-vi/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-fa/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-ka/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-af/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-sr/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-be/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-ru/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-ky/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-et/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-uk/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-hr/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-pl/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-is/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-th/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-sw/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-mk/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/xml/method.xml:87:             android:isDefault="@bool/im_is_default">
java/res/values-en/bools.xml:23:        <bool name="im_is_default">true</bool>
java/res/values-pt/bools.xml:23:        <bool name="im_is_default">true</bool>

默认的im_is_default为false,而根据不同的locale配置,im_is_default不同。当系统的locale发生变化,InputMethodManagerService 会遍历所有安装的IME APP,找到im_is_default为true,并且含有包含支持当前language的Subtype的IME APP,以此APP当做系统的默认输入法。 如果通过上述的过程,没有找到合适的APP,那么就以包含english Subtype的IME APP作为系统默认输入法应用。

在Android4.2.2中如果想在第一次开机的时候指定某个IME APP为默认的输入法,那么可以采取如下的操作: 1. 在frameworks/base/packages/SettingsProvider/res/values/defaults.xml中添加: <string name="default_input_method">IME ID</string>

  1. 在SettingsProvider 中的DatabaseHelper.java文件中loadSecureSettings方法里面,添加: loadStringSetting(stmt, Settings.Secure.DEFAULT_INPUT_METHOD,R.string.default_input_method);

如此,在系统第一次启动的时候,会以defaults.xml中的值为初始化IME APP。

如果要列出系统中安装的输入法,可以通过:ime list -a命令。如果要dump出系统输入法的详情,可以通过命令dumpsys input_method。

results matching ""

    No results matching ""