如何在Android中将一个span类型更改为另一种类型?

4
我想将CharSequence中所有相同类型的转换为不同类型的。例如,将所有加粗的转换为下划线的:

enter image description here

我该怎么做?

(今天我遇到了这个问题,由于已经解决了,所以我在这里添加了一个问答对。我的回答如下。)

1个回答

10

如何将一个类型的Span改变为另一个类型

输入图像描述

要改变spans,您需要执行以下操作:

  1. 使用 getSpans()获取所需类型的所有spans。
  2. 使用getSpanStart()getSpanEnd()查找每个span的范围。
  3. 使用removeSpan()删除原始spans。
  4. 在与旧spans相同的位置使用setSpan()添加新的span类型。

这里是完成该操作的代码:

Spanned boldString = Html.fromHtml("Some <b>text</b> with <b>spans</b> in it.");

// make a spannable copy so that we can change the spans (Spanned is immutable)
SpannableString spannableString = new SpannableString(boldString);

// get all the spans of type StyleSpan since bold is StyleSpan(Typeface.BOLD)
StyleSpan[] boldSpans = spannableString.getSpans(0, spannableString.length(), StyleSpan.class);

// loop through each bold span one at a time
for (StyleSpan boldSpan : boldSpans) {

    // get the span range
    int start = spannableString.getSpanStart(boldSpan);
    int end = spannableString.getSpanEnd(boldSpan);

    // remove the bold span
    spannableString.removeSpan(boldSpan);

    // add an underline span in the same place
    UnderlineSpan underlineSpan = new UnderlineSpan();
    spannableString.setSpan(underlineSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}

注意事项

  • 如果您只想清除旧的范围,那么在创建SpannableString时,请使用boldString.toString()。 您将使用原始的boldString来获取跨度范围。

另请参见


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接