在Android中通过自定义键盘在EditText上设置合成文本 解释我要做的事情
我正在制作一个自定义的应用程序内键盘,它的工作原理与。然而,在我的键盘上,我使用弹出窗口来显示额外的字母形式。在英语中,字母有不同的形式,这取决于它们是位于单词的开头、中间还是结尾。通常可以根据上下文确定,但有时用户需要从弹出的候选键显式地选择一个替代形式 假设用户开始键入一个单词(其中在Android中通过自定义键盘在EditText上设置合成文本 解释我要做的事情,android,custom-keyboard,mongolian-vertical-script,inputconnection,Android,Custom Keyboard,Mongolian Vertical Script,Inputconnection,我正在制作一个自定义的应用程序内键盘,它的工作原理与。然而,在我的键盘上,我使用弹出窗口来显示额外的字母形式。在英语中,字母有不同的形式,这取决于它们是位于单词的开头、中间还是结尾。通常可以根据上下文确定,但有时用户需要从弹出的候选键显式地选择一个替代形式 假设用户开始键入一个单词(其中-表示字母): 然后他们从弹出窗口中选择了a(我只是用a来表示选择一种特殊蒙古语字形的概念)。如果他们继续键入,则此字母的Unicode将显示如下: ---a-- 但是,Unicode呈现为 ---A 在单词
-
表示字母):
然后他们从弹出窗口中选择了a
(我只是用a
来表示选择一种特殊蒙古语字形的概念)。如果他们继续键入,则此字母的Unicode将显示如下:
---a--
但是,Unicode呈现为
---A
在单词的末尾。(a
和a
在Unicode中有相同的代码。)因此用户不明白为什么他们从弹出键中选择了a
,但它在编辑器中呈现为a
。不过,如果他们继续打字,那就好了,因为它会在单词中间呈现为a
我想做的是在--a
的-a
上设置某种临时跨度,这样在他们键入下一个字母之前,它就不会被呈现为--a
。但是如果他们添加了一个空格或将光标移动到另一个位置,那么它将恢复为默认的——最终字母的形式。(即,临时跨度将被取消。)
实例
如果摘要a
和a
太容易混淆,下面是一个真实的例子。用户希望在此单词中键入蒙古语UE
表单(Unicode\u1826\u180c
)
但是由于\u1826\u180c
在单词的末尾被呈现成这样
用户在继续输入之前会感到困惑。我想让跨度看起来像这样
可以使用\u1826\u180c\u200d
临时渲染
文档
警察说
如果您的IME进行文本预测或需要多个步骤来编写
如果是字形或单词,则可以在文本字段中显示进度,直到
用户提交单词,然后您可以替换部分
完成课文的作文
它给出了这个例子和图像:
InputConnection ic = getCurrentInputConnection();
ic.setComposingText("Composi", 1);
ic.setComposingText("Composin", 1);
ic.commitText("Composing ", 1);
问题
我想在这一节中描述为什么它不起作用,但在这里设置问题的过程中,我发现它确实起作用。因此,我将在下面添加我的答案,作为其他做类似事情的人的示例。当弹出窗口返回有问题的字符串时,下面的代码设置一个临时值
if (selectedItem.equals("a")) {
inputConnection.setComposingText("a", 1);
}
其中,selectedItem
是用户从按键弹出窗口中选择的字符串
请注意,a
有一条下划线,表示它是一个合成跨距。(这是一个人为的例子,如果文本立即提交,a
将被呈现为a
。)
这也适用于问题中的真实示例
if (selectedItem.equals("\u1826\u180c")) {
inputConnection.setComposingText("\u1826\u180c\u200d", 1);
}
提交撰写跨度
当确认用户想要保持写作跨度(即,他们在单词中输入更多字母)时,可以使用
inputConnection.commitText("\u1826\u180c", 1);
放弃写作跨度
如果用户单击其他位置,则不会取消合成范围。但这是一个不同的问题
您的键盘可以覆盖onUpdateSelection
,以侦听光标的更改。然后打电话
inputConnection.finishComposingText();
保留组成区域中的任何文本。或
ic.commitText("", 1);
为了摆脱它。更多信息,请参阅
ic.commitText("", 1);