在 Android 中通过自定义键盘在 EditText 上设置撰写文本
Set composing text on an EditText from a custom keyboard in Android
解释我正在尝试做什么
我正在制作一个自定义的应用程序内键盘,其工作原理与 this example. However, in my keyboard I'm using popup windows to display extra letter forms. In traditional Mongolian 字母具有不同的形式,具体取决于它们位于单词的开头、中间还是结尾。通常这些可以从上下文中确定,但有时用户需要从弹出键候选者中明确选择替代形式。
假设用户开始输入单词(其中 -
代表字母):
---
然后他们从弹出窗口中选择了a
(我只是用a
来表示选择特殊蒙古字形的概念)。如果他们继续输入,这封信的 Unicode 将呈现如下:
---a--
但是,Unicode 呈现为
---A
在词尾。 (a
和 A
在 Unicode 中具有相同的代码。)所以用户很困惑为什么他们从弹出键中选择 a
但它在编辑器中呈现为 A
.不过,如果他们继续打字,那就没问题了,因为它会在单词中间呈现为 a
。
我想做的是在 ---a
的 a
上设置某种临时跨度,这样在他们输入下一个字母之前它就不会呈现为 ---A
.但是,如果他们添加 space 或将光标移动到不同的位置,那么它将恢复为默认的 ---A
形式的最后一个字母。 (即取消临时跨度。)
实例
如果抽象的a
和A
太混乱了,这里有一个真实的例子。用户想在这个词
中输入蒙文UE
形式(Unicode\u1826\u180c
)
但是因为 \u1826\u180c
在单词的末尾被渲染成这样
用户在继续输入之前感到很困惑。我想让 span 看起来像这样
可以用\u1826\u180c\u200d
临时渲染。
文档
If your IME does text prediction or requires multiple steps to compose
a glyph or word, you can show the progress in the text field until the
user commits the word, and then you can replace the partial
composition with the completed text.
它给出了这个例子和图像:
InputConnection ic = getCurrentInputConnection();
ic.setComposingText("Composi", 1);
ic.setComposingText("Composin", 1);
ic.commitText("Composing ", 1);
问题
我打算在本节中描述它为什么不起作用,但在此处设置我的问题的过程中,我发现它确实有效。所以我将在下面添加我的答案作为其他人做类似事情的例子。
以下代码在弹出窗口 window
返回有问题的字符串时设置临时 composing span
if (selectedItem.equals("a")) {
inputConnection.setComposingText("a", 1);
}
其中 selectedItem
是用户从 window 个候选键中选择的字符串。
请注意,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);
摆脱它。有关更多信息,请参阅 。
解释我正在尝试做什么
我正在制作一个自定义的应用程序内键盘,其工作原理与 this example. However, in my keyboard I'm using popup windows to display extra letter forms. In traditional Mongolian 字母具有不同的形式,具体取决于它们位于单词的开头、中间还是结尾。通常这些可以从上下文中确定,但有时用户需要从弹出键候选者中明确选择替代形式。
假设用户开始输入单词(其中 -
代表字母):
---
然后他们从弹出窗口中选择了a
(我只是用a
来表示选择特殊蒙古字形的概念)。如果他们继续输入,这封信的 Unicode 将呈现如下:
---a--
但是,Unicode 呈现为
---A
在词尾。 (a
和 A
在 Unicode 中具有相同的代码。)所以用户很困惑为什么他们从弹出键中选择 a
但它在编辑器中呈现为 A
.不过,如果他们继续打字,那就没问题了,因为它会在单词中间呈现为 a
。
我想做的是在 ---a
的 a
上设置某种临时跨度,这样在他们输入下一个字母之前它就不会呈现为 ---A
.但是,如果他们添加 space 或将光标移动到不同的位置,那么它将恢复为默认的 ---A
形式的最后一个字母。 (即取消临时跨度。)
实例
如果抽象的a
和A
太混乱了,这里有一个真实的例子。用户想在这个词
UE
形式(Unicode\u1826\u180c
)
但是因为 \u1826\u180c
在单词的末尾被渲染成这样
用户在继续输入之前感到很困惑。我想让 span 看起来像这样
可以用\u1826\u180c\u200d
临时渲染。
文档
If your IME does text prediction or requires multiple steps to compose a glyph or word, you can show the progress in the text field until the user commits the word, and then you can replace the partial composition with the completed text.
它给出了这个例子和图像:
InputConnection ic = getCurrentInputConnection();
ic.setComposingText("Composi", 1);
ic.setComposingText("Composin", 1);
ic.commitText("Composing ", 1);
问题
我打算在本节中描述它为什么不起作用,但在此处设置我的问题的过程中,我发现它确实有效。所以我将在下面添加我的答案作为其他人做类似事情的例子。
以下代码在弹出窗口 window
返回有问题的字符串时设置临时 composing spanif (selectedItem.equals("a")) {
inputConnection.setComposingText("a", 1);
}
其中 selectedItem
是用户从 window 个候选键中选择的字符串。
请注意,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);
摆脱它。有关更多信息,请参阅