Android键盘输出unicode字符串和带有不受支持标志符号的标签

Android键盘输出unicode字符串和带有不受支持标志符号的标签,android,unicode,android-input-method,Android,Unicode,Android Input Method,我正在开发一个Android IME,它是一种美洲土著语言,它的字符不是单一的unicode代码点,而是unicode字符串。例如,一只戴着口罩的条纹羔羊:ƛ̕ 我发现自己陷入了第22条军规,因为我可以创建一个输出正确字符但没有正确标签的键,或者我可以创建正确标签但输出错误的键。我应该说,我一直在尝试用xml实现这一点,我认为相关属性如下: android:code android:keyLabel android:keyOutputText android:keycon 更多详情: 据我所

我正在开发一个Android IME,它是一种美洲土著语言,它的字符不是单一的unicode代码点,而是unicode字符串。例如,一只戴着口罩的条纹羔羊:ƛ̕

我发现自己陷入了第22条军规,因为我可以创建一个输出正确字符但没有正确标签的键,或者我可以创建正确标签但输出错误的键。我应该说,我一直在尝试用xml实现这一点,我认为相关属性如下:

  • android:code
  • android:keyLabel
  • android:keyOutputText
  • android:keycon
更多详情:

据我所知,不可能更改键盘标签上的字体,因为系统的
DEFAULT\u BOLD
font是硬编码到键盘类中的。因此,我无法使用以下方法正确定义密钥:

<Key android:keyOutputText="@string/glot_barred_lambda"
     android:keyLabel="@string/glot_barred_lambda"/>
问题似乎是
keypoutputText
keycon
不兼容。(我不知道为什么!)。这让我开始尝试:

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

这可以很好地编译和运行,但没有给出正确的行为。按键标签看起来很不错,但输出的是单抽头上的barred lambda(411)和双抽头上的组合变音符号(789)


我已经没有什么想法了,所以我期待着真正的专家给我一些建议。非常感谢你们的阅读,我很高兴澄清我的问题,因为你们需要我

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

由于
android:keyOutputText
对带有
android:keyIcon
的键不起作用,我被迫使用
android:code
。虽然android:code不输出字符串,但我发现我可以在XML中指定负数作为个人代码,然后使用这些代码在java中指定我自己的输出文本

例如,在XML中:

<Key android:codes="-1001" 
     android:keyIcon="@drawable/keyboard_barred_lambda" />
...
我仍然有兴趣知道是否有更优雅的解决方案。但这最终为我的语言找到了一种有效的输入法

此外,我还向谷歌提交了一个关于键盘XML解析器的bug:


也许我的问题的答案就像定义一个KeyCharacterMap一样。然而,这些文档似乎没有满足我的需求(输出Unicode字符串并用图标标记键)。喜欢听专家的话。老兄,在少数民族语言地区,这里很孤独。我在2017年尝试了类似的方法,我(更简单)的挑战是我们所有的项目文档都是U+nnnn十六进制格式,xml文件似乎更喜欢nnn这样的十进制键。我当然可以重新计算,但因为我已经知道十六进制代码很多年了,这很烦人。我也找不到如何以U+nnnn的形式串几个代码。也许你可以看看我的问题谢谢。你所谓的“文档链接”可能已经移动了。我能找到的最接近的是现在(2017年10月):
<Key android:codes="-1001" 
     android:keyIcon="@drawable/keyboard_barred_lambda" />
...
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