8

好吧,我尝试构建一个富文本编辑器。我有一些按钮来格式化我的可编辑文本(粗体、斜体、URL 等)。
我使用启用了所有文本更正选项的谷歌键盘(设置>语言和输入>谷歌键盘>文本更正)。

我执行以下操作:

在我的EditText中,我写了一些文字。
文本

我选择它并应用带有SPAN_EXCLUSIVE_EXCLUSIVE(33) 作为标志的粗体跨度。
选定的文本
在此处输入图像描述

然后,我将光标移动到末尾。
光标在末尾

最后,我将文本添加到文本的末尾。添加的文本应该没有粗体。
粗体字

好的,这就是问题所在。我的粗体跨度标志已经改变......为什么!?

这是一些日志:

D/ContentUtils: beforeTextChanged: start  end  span             flags
D/ContentUtils: beforeTextChanged: 0      7    ChangeWatcher    8388626
D/ContentUtils: beforeTextChanged: 0      7    ChangeWatcher    6553618
D/ContentUtils: beforeTextChanged: 0      7    TextKeyListener  18
D/ContentUtils: beforeTextChanged: 0      7    SpanController   18
D/ContentUtils: beforeTextChanged: 7      7    START            546
D/ContentUtils: beforeTextChanged: 7      7    END              34
D/ContentUtils: beforeTextChanged: 0      7    SpellCheckSpan   33
D/ContentUtils: beforeTextChanged: 0      7    CustomBoldSpan   33

D/ContentUtils: onTextChaghed
D/ContentUtils: onTextChaghed:     0      8    ChangeWatcher    8392722
D/ContentUtils: onTextChaghed:     0      8    ChangeWatcher    6557714
D/ContentUtils: onTextChaghed:     0      8    TextKeyListener  4114
D/ContentUtils: onTextChaghed:     0      8    SpanController   4114
D/ContentUtils: onTextChaghed:     8      8    START            546
D/ContentUtils: onTextChaghed:     8      8    END              34
D/ContentUtils: onTextChaghed:     0      8    CustomBoldSpan   4129
D/ContentUtils: onTextChaghed:     0      8    UnderlineSpan    289
D/ContentUtils: onTextChaghed:     0      8    ComposingText    289

D/ContentUtils: afterTextChanged
D/ContentUtils: afterTextChanged:  0      8    ChangeWatcher    8392722
D/ContentUtils: afterTextChanged:  0      8    ChangeWatcher    6557714
D/ContentUtils: afterTextChanged:  0      8    TextKeyListener  4114
D/ContentUtils: afterTextChanged:  0      8    SpanController   4114
D/ContentUtils: afterTextChanged:  8      8    START            546
D/ContentUtils: afterTextChanged:  8      8    END              34
D/ContentUtils: afterTextChanged:  0      8    CustomBoldSpan   4129
D/ContentUtils: afterTextChanged:  0      8    UnderlineSpan    289
D/ContentUtils: afterTextChanged:  0      8    ComposingText    289
D/ContentUtils: afterTextChanged:  0      8    SpellCheckSpan   33

当我使用另一个键盘时,一切都很好。
当我禁用文本校正设置时,一切正常。我所有的跨度都是自定义跨度,并且是现有 Android 跨度的子类。

谷歌键盘似乎自己修改了我的跨度(可能是因为Show suggestions设置)。
我怎样才能避免这种情况?
也许我错过了一些关于跨度标志的东西?

4

1 回答 1

3

好的,经过一些研究,似乎键盘在键入时会在单词周围应用一些跨度以管理建议。

问题是对于每个键入的字母,单词被删除并与添加的字母一起添加回来。在这一点上,我松开了一些自定义跨度,比如单词中间的那些。

如果您将TextWatcher添加到您的EditText,它将被调用 2 次:第一次使用添加的字母,第二次删除并添加回整个单词。一点都不方便。

因此,一个丑陋的解决方案是在第二个期间复制所有跨度beforeTextChanged()并在第二个期间应用回来afterTextChanged()。但是实现起来很复杂。

无论如何,其他应用程序并没有做得更好:GMail 和 Evernote 也有同样的问题。我选择不担心,不应用丑陋的解决方案。我的富文本编辑器可以这样使用...

于 2016-09-26T13:21:07.180 回答