4

我想在 a 中获取一种类型的所有跨度CharSequence并将它们转换为不同的类型。例如,将所有粗体跨度转换为下划线跨度:

在此处输入图像描述

我该怎么做?

(这是我今天遇到的一个问题,既然我现在已经解决了,我在这里添加一个问答对。我的答案如下。)

4

1 回答 1

9

如何将跨度从一种类型更改为另一种类型

在此处输入图像描述

为了更改跨度,您需要执行以下操作

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

这是执行此操作的代码:

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);
}

笔记

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

也可以看看

于 2018-02-01T18:08:48.250 回答