2

解释我想要做什么

我正在制作一个自定义应用内键盘,其工作原理与此示例相同。但是,在我的键盘中,我使用弹出窗口来显示额外的字母形式。在传统的蒙古文中,字母有不同的形式,具体取决于它们是位于单词的开头、中间还是结尾。通常这些可以从上下文中确定,但有时用户需要从弹出键候选中明确选择替代形式。

假设用户开始输入一个单词(其中-代表字母):

--- 

然后他们a从弹出窗口中选择(我只是a用来表示选择一种特殊的蒙古字形形式的概念)。如果他们继续输入,这封信的 Unicode 将呈现如下:

---a--

但是,Unicode 呈现为

---A

在词尾。(a并且A在 Unicode 中有相同的代码。)所以用户很困惑为什么他们a从弹出键中选择,但它会像A在编辑器中一样呈现。但是,如果他们只是继续打字,那会很好,因为它会呈现a在单词的中间。

我想要做的是在 of 上设置某种临时跨度a---a这样它就不会像---A在他们键入下一个字母之前那样被渲染。但是如果他们添加一个空格或将光标移动到不同的位置,那么它将恢复---A为最终字母的默认形式。(即临时跨度将被取消。)

真实例子

如果抽象aA过于混乱,这里有一个真实的例子。用户想在这个词中输入一个蒙古语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);

在此处输入图像描述

问题

我打算在本节中描述它为什么不起作用,但在此处设置我的问题的过程中,我发现它确实有效。因此,我将在下面添加我的答案作为其他人做类似事情的示例。

4

1 回答 1

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

摆脱它。有关更多信息,请参阅此答案

于 2017-07-20T02:54:29.710 回答