【问题标题】:How to create Android KeyEvent for arbitrary Unicode character?如何为任意 Unicode 字符创建 Android KeyEvent?
【发布时间】:2017-06-17 20:28:38
【问题描述】:

我正在编写一个 IME。如您所料,它扩展了 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);
}

它适用于字母、数字和一些标点符号,但它似乎只适用于您可以在 PC 键盘上直接输入的字符(无需死键体操或使用 alt 键盘)。

某些特定字符会导致 charMap.getEvents(...) 在传递具有以下值的单个元素的 char[] 时返回 null:

  • 欧元符号'€' (\u20ac)
  • 英镑符号'£' (\u00a3)。
  • 它还会卡住重音字符,例如 'é' (\uc3a9)

TL/DR:给定一个 char,其值为任意 Unicode 值,如何将其转换为 KeyEvent(或 KeyEvent 对象序列),当传递给 sendKeyEvent() 时,将导致 Android 采取行动就像您直接从幻象键盘输入该字符一样?

【问题讨论】:

    标签: android android-softkeyboard android-input-method


    【解决方案1】:

    通常 IME 不会生成按键事件。它通常使用 inputConnection.commit() 向应用程序发送数据。该 API 采用任何 CharSequence(甚至可以包括有限的样式)。

    【讨论】:

    • 如果您不使用预测,您可以使用 inputConnection.commit() 吗? (我正在创建一个使用蓝牙鼠标上的按钮输入摩尔斯(-ish)码的 IME)
    • 是的。输入连接与预测无关。它是连接到键盘的 View 和键盘应用程序之间的通信通道。
    • @Bitbang3r ,您能好心一点并能够分享最终实现的 sn-p 吗?我正在为类似的场景而苦苦挣扎,控制字符很容易,但除了基本的拉丁语和标点符号之外的任何东西似乎都遥不可及。
    猜你喜欢
    • 1970-01-01
    • 2017-11-23
    • 2019-09-07
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 1970-01-01
    • 2012-03-19
    • 2011-06-27
    相关资源
    最近更新 更多