我正在开发一种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字体不支持此字形。
因此我认为我必须为关键标签制作一个图标。我这样做了。但是,此定义给出了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)上组合变音符号。
我的想法已经用完,所以我期待着真正的专家提出一些建议。非常感谢阅读,我很乐意澄清我的问题,因为你们需要我。
答案 0 :(得分:1)
我找到了一个可能有点像kludge的答案,但它可以工作并允许输出unicode字符串并将图标作为标签的Keys所需的功能。
由于android:keyOutputText
无法处理具有android:keyIcon
的密钥,因此我被迫使用android:codes
。虽然android:codes
没有输出字符串,但我发现我可以在XML中将负数作为个人代码分配,然后使用这些代码在java中分配我自己的输出文本。
例如,在XML中:
<Key android:codes="-1001"
android:keyIcon="@drawable/keyboard_barred_lambda" />
...
然后在handleCharacter
中的IME.java中:
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解析器的错误: