截取硬件的按鍵事件
即使輸入法窗口沒有明確的焦點,它也會首先接收到硬件的按鍵事件,並能夠選擇是使用還是把它們轉發給應用程序。例如,在文本編排期間,你可以使用方向鍵在輸入法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)”,或者是其他對應的語言。