如何在 Android 中将一种跨度类型更改为另一种跨度类型?
How to change one span type to another in Android?
我想在 CharSequence
中获取一种类型的所有跨度并将它们转换为不同的类型。例如,将所有粗体范围转换为下划线范围:
我该怎么做?
(这是我今天遇到的问题,现在已经解决了,在这里加个问答,下面是我的回答。)
如何将 span 从一种类型更改为另一种类型
要更改跨度,您需要执行以下操作
- 使用
getSpans()
获取所需类型的所有跨度
- 用
getSpanStart()
和getSpanEnd()
求每个span的范围
- 用
removeSpan()
删除原始跨度
- 在与旧跨度相同的位置添加
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);
}
备注
- 如果您只想清除所有旧跨度,请在创建
SpannableString
时使用 boldString.toString()
。您将使用原始 boldString
来获取跨度范围。
另见
- Is it possible to have multiple styles inside a TextView?
- Meaning of Span flags
我想在 CharSequence
中获取一种类型的所有跨度并将它们转换为不同的类型。例如,将所有粗体范围转换为下划线范围:
我该怎么做?
(这是我今天遇到的问题,现在已经解决了,在这里加个问答,下面是我的回答。)
如何将 span 从一种类型更改为另一种类型
要更改跨度,您需要执行以下操作
- 使用
getSpans()
获取所需类型的所有跨度
- 用
getSpanStart()
和getSpanEnd()
求每个span的范围
- 用
removeSpan()
删除原始跨度
- 在与旧跨度相同的位置添加
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);
}
备注
- 如果您只想清除所有旧跨度,请在创建
SpannableString
时使用boldString.toString()
。您将使用原始boldString
来获取跨度范围。
另见
- Is it possible to have multiple styles inside a TextView?
- Meaning of Span flags