android怎么遍历字符串,如何遍历Android中的SpannedString或SpannableString中的跨度

按顺序循环跨越

您可以使用getSpans在Spanned或Spannable String中获取跨度数组.但是,只需循环遍历getSpans结果将为not necessarily give them to you in order.为了使它们按顺序排列,您可以使用nextSpanTransition.

下面是一个SpannedString示例,如问题中的示例. (SpannableString的工作方式相同.)绿线表示跨度转换的位置.默认情况下,文本为黑色.

5b5cdd6c1ee5c58163422a271b94d239.png

代码找到下一个跨度转换,然后获取当前范围内的所有跨度.

int next;

for (int i = 0; i < spannableString.length(); i = next) {

// find the next span transition

next = spannableString.nextSpanTransition(i, spannedString.length(), CharacterStyle.class);

// get all spans in this range

int numOfSpans = 0;

CharacterStyle[] spans = spannableString.getSpans(i, next, CharacterStyle.class);

for(int j = 0; j < spans.length; j++) {

numOfSpans++;

}

Log.i("TAG", "spans from " + i + " to " + next + ": " + numOfSpans);

}

输出:

spans from 0 to 1: 0

spans from 1 to 3: 1

spans from 3 to 8: 2

spans from 8 to 11: 1

spans from 11 to 12: 0

跨度的类型

通常在循环跨越时,您会选择某种类型的跨度.例如,如果要删除所有前景颜色跨度,可以执行以下操作:

// get spans

ForegroundColorSpan[] spans = spannableString.getSpans(0, spannableString.length(), ForegroundColorSpan.class);

// loop through spans

for (ForegroundColorSpan span : spans) {

spannableString.removeSpan(span);

}

请注意,这不适用于SpannedString,因为SpannedString中的跨距不可变(请参阅this answer).

如果您想获得任何类型的所有跨度,您可以将类型设置为Object.class.

Object[] spans = spannableString.getSpans(0, spannableString.length(), Object.class);

如果您想要在角色级别影响外观的所有跨度,则可以使用CharacterStyle.class.如果在循环内你想进一步限制跨度到属于MetricAffectingSpan的那些,你可以这样做.

CharacterStyle[] spans = spannableString.getSpans(0, spannableString.length(), CharacterStyle.class);

for (CharacterStyle span : spans) {

if (span instanceof MetricAffectingSpan) {

// do something

}

}

以下是范围类型的一般分层细分.它可能不完整.有关更多信息,请阅读Spans, a Powerful Concept.

Object

CharacterStyle

BackgroundColorSpan

ClickableSpan

URLSpan

ForegroundColorSpan

MaskFilterSpan

StrikethroughSpan

SuggestionSpan

UnderlineSpan

MetricAffectingSpan

AbsoluteSizeSpan

LocaleSpan

RelativeSizeSpan

ReplacementSpan

DynamicDrawableSpan

ImageSpan

ScaleXSpan

StyleSpan

SubscriptSpan

SuperscriptSpan

TextAppearanceSpan

TypefaceSpan

ParagraphStyle

AlignmentSpan

AlignmentSpan.Standard

BulletSpan

DrawableMarginSpan

IconMarginSpan

LeadingMarginSpan

LeadingMarginSpan.LeadingMarginSpan2

LeadingMarginSpan.Standard

LineBackgroundSpan

LineHeightSpan

LineHeightSpan.WithDensity

QuoteSpan

TabStopSpan

TabStopSpan.Standard

WrapTogetherSpan

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值