2017-02-01 27 views
0

我在寫IME。正如你所期望的那樣,它擴展了InputMethodService。如何爲任意Unicode字符創建Android KeyEvent?

在的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); 
} 

它爲字母,數字和一些標點符號,但似乎只爲你可以直接輸入文字(不deadkey-體操或使用ALT鍵)工作在PC鍵盤上。

一些特定字符時,通過一個char []與一個單一的元素,其值是以下中導致charMap.getEvents(...)返回NULL:

  • 歐元符號「€」(\ u20ac)
  • 英鎊符號'£'(\ u00a3)。
  • 它還扼流圈重音字符,如「E」(\ uc3a9)

TL/DR:給定一個字符,其值是一些任意的Unicode值,你怎麼把它轉換成的KeyEvent(或KeyEvent對象序列),當傳遞給sendKeyEvent()時,會導致Android如同直接從幻像鍵盤輸入該字符一樣行事?

回答

1

通常情況下,IME不會生成關鍵事件。它通常使用inputConnection.commit()將數據發送到應用程序。該API採用任何CharSequence(甚至可以包括有限的樣式)。

+0

如果您不使用預測,您可以使用inputConnection.commit()嗎? (我正在創建一個使用藍牙鼠標上的按鈕輸入Morse(-ish)代碼)的IME – Bitbang3r

+0

是的。輸入連接與預測無關。它是連接到鍵盤和鍵盤應用程序的View之間的通信通道。 –

+0

謝謝,完美的作品! :-) – Bitbang3r

相關問題