Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/189.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Android中通过自定义键盘在EditText上设置合成文本 解释我要做的事情_Android_Custom Keyboard_Mongolian Vertical Script_Inputconnection - Fatal编程技术网

在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);