【问题标题】:Spanned string loses bold style when adding characters跨区字符串在添加字符时失去粗体样式
【发布时间】:2018-12-02 17:36:41
【问题描述】:

我在EditText 中设置了以下文本和样式:

SpannableStringBuilder sb = new SpannableStringBuilder();

sb.append("Hello");
sb.setSpan(new StyleSpan(Typeface.BOLD), 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
sb.append("World Test");
et.setText(sb);

结果是这样的:“HelloWorld Test”。这可以。现在,当我将光标放在“d”字符之后(即在分隔WorldTest 的空格之前)并输入一个字符时,Hello 会自动失去其粗体样式。

这是为什么呢?这让我很困惑。仅当将光标直接放在World 中的“d”之后并输入字符时才会发生这种情况。对于所有其他光标位置,它按预期工作。

为什么会这样以及如何解决?我希望 Hello 保持粗体。

【问题讨论】:

  • 当您手动编辑editText时,文本被替换,这就是原因。你需要在textview上实现一个text watcher,并手动将粗体样式重新设置为你需要的部分
  • 但是当我将光标放在“d”字符之后时,为什么它会丢失格式only?对于所有其他光标位置,格式保持不变。只有这个光标位置会导致格式丢失。
  • 尝试添加一个 textWatcher 并查看调用了哪些回调
  • 好的,通过检查回调参数,我可以看到当光标位于有问题的位置时,会替换整个范围的字符,而在其他位置仅替换单个字符。那么这种行为是有道理的。但是看到我必须手动重新应用样式真的很令人沮丧。确实应该有一种方法可以让EditText 自动执行此操作。
  • 我同意你的观点,我也希望这是“默认”行为,很高兴你找到了解决方案,你能发布吗?

标签: android android-edittext textview spannablestring spanned


【解决方案1】:

也许你应该试试这个

SpannableStringBuilder sb = new SpannableStringBuilder();
int s = sb.length();
sb.append("Hello");
sb.setSpan(new ForegroundColorSpan(0xFFCC5500), s, 
sb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

sb.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), s, 
sb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
sb.append("World Test");
et.setText(sb);

或者在 api 21 之后试试这个

SpannableStringBuilder sb = new SpannableStringBuilder();
StyleSpan bold = new StyleSpan(android.graphics.Typeface.BOLD);
sb.append("Hello")
          .append("BOLD ", bold, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
          .append("World");

喜欢html风格的试试下​​面

String str = "<b>" + "hello" + "</b> " + "World Test"; 
et.setText(Html.fromHtml(str));

【讨论】:

  • 尝试了您的两个 sn-ps,但它们显示出完全相同的行为:将光标直接放在空格字符之前并输入字符时,光标左侧的文本会丢失所有格式.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
相关资源
最近更新 更多