2

我正在开发一个适用于美国本土语言的 Android IME,它的字符不是单个 unicode 代码点而是 unicode 字符串。例如,声门化的禁止 lambda:ƛ̕

我发现自己处于 catch-22 中,因为我可以创建一个输出正确字符但没有正确标签的 Key,或者我可以有正确的标签但输出错误。我应该说我一直在尝试在 xml 中实现这一点,我认为相关的属性是:

  • android:codes
  • android:keyLabel
  • android:keyOutputText
  • android:keyIcon

更多详情:

据我所知,不可能更改 keyLabel 上的字体,因为系统的DEFAULT_BOLD字体被硬编码到 Keyboard 类中。因此我不能使用以下来正确定义密钥:

<Key android:keyOutputText="@string/glot_barred_lambda"
     android:keyLabel="@string/glot_barred_lambda"/>

(其中字符串常量glot_barred_lambda在相关位置定义为“ƛ̕”)

问题是默认的 Android 字体不支持此字形。

因此,我认为我必须为 keylabel 制作一个图标。我这样做了。然而,这个定义给出了 NullPointerError:

<Key android:keyOutputText="@string/glot_barred_lambda" 
     android:keyIcon="@drawable/keyboard_barred_lambda" />`

问题似乎keyOutputText是与keyIcon. (我不知道为什么!)。所以这让我尝试了这个:

<Key android:codes="411,789" 
     android:keyIcon="@drawable/keyboard_barred_lambda" />

这编译并运行良好,但没有给出正确的行为。键标签看起来不错,但输出只是单击时的禁止 lambda(411)和双击时的组合变音符号(789)。

我的想法已经用完了,所以我期待真正专家的一些建议。非常感谢您的阅读,我很高兴在你们需要我的时候澄清我的问题。

4

1 回答 1

1

我找到了一个可能有点杂乱无章的答案,但它可以工作并允许输出 unicode 字符串并将图标作为标签的键的所需功能。

由于android:keyOutputText无法使用具有 的键,因此android:keyIcon我被迫使用android:codes. 虽然android:codes不输出字符串,但我发现我可以在 XML 中将负数指定为个人代码,然后使用这些代码在 java 中指定我自己的输出文本。

例如,在 XML 中:

<Key android:codes="-1001" 
     android:keyIcon="@drawable/keyboard_barred_lambda" />
...

然后在我的 IME.java 中handleCharacter

private void handleCharacter(int primaryCode, int[] keyCodes) {
    ...
    if (isAlphabet(primaryCode) && mPredictionOn) {
    ...
    } else {
        // handling composing characters here now because
        // android won't let us use an icon along with outputText
        // this is dirty!
        if(primaryCode == -1001) {
          getCurrentInputConnection().commitText("ƛ̕", 1);
        } else if(primaryCode == -1002) {
          getCurrentInputConnection().commitText("q̓", 1);
        // etc

我仍然很想知道是否有更优雅的解决方案。但这最终让我找到了适合我的语言的输入法。

另外,我向谷歌提交了一个关于键盘 XML 解析器的错误:

https://code.google.com/p/android/issues/detail?id=62294

于 2013-11-20T16:47:30.743 回答