Why deleteSurroundingText doesn't work with emojis and select all?

时间:2017-12-17 08:28:26

标签: java android android-softkeyboard soft-keyboard

I'm working on a custom keyboard and I'm using deleteSurroundingText to delete characters. I only have two issue with this. deleteSurroundingText doesn't work well while deleting emojis. I need to press del button twice in order to get rid of single emoji. And second del key is not working with select all option.

case Keyboard.KEYCODE_DELETE:
    getCurrentInputConnection().deleteSurroundingText(1,0);
    break;

This is what happens to emoji when I press try to del an emoji: ?

It turns into a question mark. Also, when I try to del text by doing select all nothing happens.

Any help would be appreciated

2 个答案:

答案 0 :(得分:1)

Java使用16位字符(请参阅文档中的note)。因此,一个字符可以存储从U+0000U+FFFF的代码点。
现代unicode定义从U+0000U+10FFFF的代码点范围。 大多数表情符号的代码点都超过U+FFFF。为了表示这样的代码点,使用了所谓的“surrogate pairs” 换句话说,每个表情符号(以及U+FFFF边界以外的所有其他代码点)都由字符串中的两个后续字符表示。
当你致电deleteSurroundingText(1,0);时,你腐败了代理人对。尚未删除的代理对的部分将呈现为?标记。

deleteSurroundingText()的文档特别强调了这种情况:

IME作者:请注意不要只删除代理对的一半。另外注意不要删除比编辑器中更多的字符,因为这可能会对应用程序产生不良影响。调用此方法将导致编辑器在批输入结束后调用服务上的onUpdateSelection(int,int,int,int,int,int)。

请在尝试使用之前仔细阅读方法文档。

使用Chracter::isSurrogate()方法判断字符是否是代理对的一部分。

答案 1 :(得分:0)

如果存在某些选择,并且应将其全部删除,则可以使用commitText("", 1)-这将用空字符串替换选择的文本。