问题
I would like to take all the spans of one type in a CharSequence
and convert them to a different type. For example, convert all the bold spans to underline spans:
How would I do that?
(This was a problem I was facing today, and since I have solved it now, I am adding a Q&A pair here. My answer is below.)
回答1:
How to change spans from one type to another
In order change the spans, you need to do the following things
- Get all the spans of the desired type by using
getSpans()
- Find the range of each span with
getSpanStart()
andgetSpanEnd()
- Remove the original spans with
removeSpan()
- Add the new span type with
setSpan()
in the same locations as the old spans
Here is the code to do that:
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);
}
Notes
- If you want to just clear all the old spans, then use
boldString.toString()
when creating theSpannableString
. You would use the originalboldString
to get the span ranges.
See also
- Is it possible to have multiple styles inside a TextView?
- Looping through spans in order (explains types of spans)
- Meaning of Span flags
来源:https://stackoverflow.com/questions/48569172/how-to-change-one-span-type-to-another-in-android