7

我正在尝试使用标志 SPAN_EXCLUSIVE_EXCLUSIVE 在 SpannableStringBuilder 上设置跨度,并且在进一步编辑要设置跨度的文本时遇到问题。

预期行为 1:原始文本。2:之前添加的文字。3:后加空格的文字。

在样式文本后添加文本时出现意外行为

我不希望添加的文本被设置样式,并且想知道我做错了什么。

编辑 1:问题发生在 Moto X Play 上,但未在 Nexus 5X 上重现。仍在其他设备上测试。

4

2 回答 2

0

TL;DR:使用某些 IME,如 Gboard,当直接在单词后添加字符(不带空格)时,IME 将替换整个单词trictrick而不是仅附加c.

详细回答:IME 如何与编辑器一起工作。

一些 IME 如何向编辑器指示命令 IME 通过 InputConnection 接口与编辑器(例如 EditText)进行通信,它们可以在用户输入后发送命令,并获取当前文本。

Gboard IME 的工作方式如下:

  • 获取光标前后的文本
  • 检测当前“正在组合”的单词并要求编辑器突出显示并记住它(通常会导致单词被下划线 - 检查下面的屏幕截图)

了解当前组成的单词可以启用许多功能,例如建议单词或自动更正拼写。

  • 每当用户输入一个字符时,Gboard 会要求编辑器将当前组成的文本设置为一个新值,即替换tricktricky
  • 输入空格后,Gboard 会对当前的组成区域进行最终替换,最终自动更正拼写
  • 当前正在撰写的区域被重置为下一个单词。

不幸的是,这打破了我们通常对SPAN_EXCLUSIVE_EXCLUSIVE.

带有 Gboard 的屏幕截图,在当前组成区域下划线

于 2021-07-12T13:10:17.350 回答
0

您可能只是不按应有的方式添加文本。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);

结果: 使用此代码运行 MainActivity 的 Nexus 7 模拟器

于 2017-05-22T07:15:23.553 回答