截取硬件的按键事件
即使输入法窗口没有明确的焦点,它也会首先接收到硬件的按键事件,并能够选择是使用还是把它们转发给应用程序。例如,在文本编排期间,你可以使用方向键在输入法UI的候选区进行导航。你也可以捕获回退键来消除从输入法窗口弹出的任何窗口。
重写onKeyDown()和onKeyUp()方法来获取硬件的按键事件。
对于不想自己处理的按键,要记住调用super()方法。
创建IME的子类型
子类型运行IME来展现多种输入模式以及由IME所支持的语言。一个子类型可以表现为:
1. 一种语言环境,如en_US或fr_FR;
2. 一种输入模式,如语音、键盘或手写;
3. 其他的输入样式、格式、或特殊的IME属性,如10个键或qwerty键盘的布局等。
基本上模式是任意文字,如“keyboard”、“voice”等等。
一个子类型也可以是这些类型的一个组合。
子类型信息被用于输入法的切换,在通知栏和IME设置窗口中可以使用。这些信息也允许框架直接携带特定的IME子类型。当你创建一个IME时,可以方便的使用子类型,因为它会帮助用户标识并完成不同IME语言和模式之间的切换。
使用<subtype>元素在输入法的XML资源文件中定义一种子类型。下面的示例中定义了两种子类型:一种是用于美国英语环境的键盘子类型,另一中是用于法语环境的键盘子类型:
<input-method xmlns:android="http://schemas.android.com/apk/res/android"
android:settingsActivity="com.example.softkeyboard.Settings"
android:icon="@drawable/ime_icon"
<subtype android:name="@string/display_name_english_keyboard_ime"
android:icon="@drawable/subtype_icon_english_keyboard_ime"
android:imeSubtypeLanguage="en_US"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="somePrivateOption=true"
/>
<subtype android:name="@string/display_name_french_keyboard_ime"
android:icon="@drawable/subtype_icon_french_keyboard_ime"
android:imeSubtypeLanguage="fr_FR"
android:imeSubtypeMode="keyboard"
android:imeSubtypeExtraValue="foobar=30,someInternalOption=false"
/>
<subtype android:name="@string/display_name_german_keyboard_ime"
...
/>
/>
使用%s来获得与子类型的语言标签相同的子类型标签,以便确保你的子类型在UI中被正确的标记。以下是输入法的部分XML文件:
<subtype
android:label="@string/label_subtype_generic"
android:imeSubtypeLocale="en_US"
android:icon="@drawable/icon_en_us"
android:imeSubtypeMode="keyboard" />
以下是部分的IME的strings.xml文件。字符串资源label_subtype_generic被输入法的UI用于设置子类型的标签,定义如下:
<stringname="label_subtype_generic">%s</string>
这样在任何英语的语言环境中,就会把子类型的显示名称设置为“English(United States)”,或者是其他对应的语言。