我正在写输入法。正如您所期望的,它扩展了InputMethodService。
在onCreate()中,我获得了一个KeyCharacterMap:
keyCharacterMap = KeyCharacterMap.load(KeyCharacterMap.VIRTUAL_KEYBOARD);
我需要一种为任意Unicode字符注入虚幻按键的方法。我的第一次刺看起来像这样:
public void generatePhantomKeypress(char[] c) {
KeyEvent[] keySequence = charMap.getEvents(c);
for (KeyEvent k : keySequence)
getCurrentInputConnection().sendKeyEvent(k);
}
它适用于字母、数字和一些标点符号,但它似乎只适用于你可以在电脑键盘上直接输入的字符(无需按键体操或使用alt键盘)。
某些特定字符导致charMap.getEvents(…)在传递带有单个元素的char[]时返回null,该元素的值如下:
- 欧元符号"€"(\u20ac)
- 英镑符号"£"(\u00a3)
- 它也会让重音字符窒息,比如"é"(\uc3a9)
TL/DR:给定一个值为任意Unicode值的字符,如何将其转换为KeyEvent(或KeyEvent对象序列),当将其传递给sendKeyEvent()时,将导致Android表现为直接从幻影键盘输入该字符
通常IME不会生成关键事件。它通常使用inputConnectioncommit()向应用程序发送数据。API接受任何CharSequence(甚至可以包括有限的样式)。