我正在尝试使用标志 SPAN_EXCLUSIVE_EXCLUSIVE 在 SpannableStringBuilder 上设置跨度,并且在进一步编辑要设置跨度的文本时遇到问题。
预期行为 1:原始文本。2:之前添加的文字。3:后加空格的文字。
我不希望添加的文本被设置样式,并且想知道我做错了什么。
编辑 1:问题发生在 Moto X Play 上,但未在 Nexus 5X 上重现。仍在其他设备上测试。
我正在尝试使用标志 SPAN_EXCLUSIVE_EXCLUSIVE 在 SpannableStringBuilder 上设置跨度,并且在进一步编辑要设置跨度的文本时遇到问题。
预期行为 1:原始文本。2:之前添加的文字。3:后加空格的文字。
我不希望添加的文本被设置样式,并且想知道我做错了什么。
编辑 1:问题发生在 Moto X Play 上,但未在 Nexus 5X 上重现。仍在其他设备上测试。
TL;DR:使用某些 IME,如 Gboard,当直接在单词后添加字符(不带空格)时,IME 将替换整个单词tric
,trick
而不是仅附加c
.
一些 IME 如何向编辑器指示命令 IME 通过 InputConnection 接口与编辑器(例如 EditText)进行通信,它们可以在用户输入后发送命令,并获取当前文本。
Gboard IME 的工作方式如下:
了解当前组成的单词可以启用许多功能,例如建议单词或自动更正拼写。
trick
为tricky
不幸的是,这打破了我们通常对SPAN_EXCLUSIVE_EXCLUSIVE
.
您可能只是不按应有的方式添加文本。SpannableStringBuilder 的使用.insert()
和.append()
方法添加额外的文本。
我刚刚尝试了您尝试实现的目标,结果如下:
TextView hratkyTextView = (TextView) findViewById(R.id.spannableHratkyTextView);
final StyleSpan bss = new StyleSpan(android.graphics.Typeface.BOLD); // Span to make text bold
// "Test text" part (in bold)
SpannableStringBuilder builder = new SpannableStringBuilder("Test text");
builder.setSpan(bss, 0, builder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// Prepending "before" (non-bold)
builder.insert(0, "before");
// Appending " after_with_space" to the end of the string
builder.append(" after_with_space");
hratkyTextView.setText(builder);