在段落中多次跨越特定字符串
Span particular string multiple times in the paragraph
我试图在 paragraph.But 中显示的任何位置跨越相同的字符串,问题是它跨越段落中匹配的唯一第一个字符串。
例如你好,这是我在段落中的字符串。字符串是可变的。
在这种情况下,我想跨越单词“String”在行或段落中使用的任何位置。在当前的实现中,它只跨越第一次与段落匹配的地方,而不检查段落的其余部分。请帮我解决这个问题。
public void setClickableText(final Context context, String[] hyperText) {
String text = getText().toString();
SpannableStringBuilder stringBuilder = new SpannableStringBuilder(text);
for (int i=0; i<hyperText.length; i++) {
if (text.indexOf(hyperText[i]) > 0) {
subString = hyperText[i];
}
int startIndex = text.indexOf(subString);
int endIndex = startIndex + subString.length();
stringBuilder.setSpan(createSpan(subString), startIndex,endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
this.setText(stringBuilder);
this.setMovementMethod(LinkMovementMethod.getInstance());
}
private ClickableSpan createSpan(final String forString) {
return new ClickableSpan() {
@Override
public void onClick(View textView) {
if (listener != null) {
listener.onClickHyperText(forString);
}
}
@Override
public void updateDrawState(TextPaint state) {
super.updateDrawState(state);
state.setUnderlineText(false);
state.setColor(ContextCompat.getColor(getContext(), R.color.citiLinkColor));
}
};
}
方法调用
text.setClickableText(context, new String[]{"String"});
您需要一个内部循环,它使用 indexOf(String, int)
遍历每个 hyperText[i]
出现的位置。像这样:
for (int i = 0; i < hyperText.length; i++) {
int pos = 0;
while ((pos = text.indexOf(hyperText[i], pos)) > 0) {
int end = pos + hyperText[i].length();
stringBuilder.setSpan(createSpan(hypertext[i]), pos, end,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
pos = end;
}
}
请注意,这种查找单词匹配项的方法会忽略单词边界和重叠单词/跨度。您可能需要重新考虑...
我试图在 paragraph.But 中显示的任何位置跨越相同的字符串,问题是它跨越段落中匹配的唯一第一个字符串。
例如你好,这是我在段落中的字符串。字符串是可变的。
在这种情况下,我想跨越单词“String”在行或段落中使用的任何位置。在当前的实现中,它只跨越第一次与段落匹配的地方,而不检查段落的其余部分。请帮我解决这个问题。
public void setClickableText(final Context context, String[] hyperText) {
String text = getText().toString();
SpannableStringBuilder stringBuilder = new SpannableStringBuilder(text);
for (int i=0; i<hyperText.length; i++) {
if (text.indexOf(hyperText[i]) > 0) {
subString = hyperText[i];
}
int startIndex = text.indexOf(subString);
int endIndex = startIndex + subString.length();
stringBuilder.setSpan(createSpan(subString), startIndex,endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
this.setText(stringBuilder);
this.setMovementMethod(LinkMovementMethod.getInstance());
}
private ClickableSpan createSpan(final String forString) {
return new ClickableSpan() {
@Override
public void onClick(View textView) {
if (listener != null) {
listener.onClickHyperText(forString);
}
}
@Override
public void updateDrawState(TextPaint state) {
super.updateDrawState(state);
state.setUnderlineText(false);
state.setColor(ContextCompat.getColor(getContext(), R.color.citiLinkColor));
}
};
}
方法调用
text.setClickableText(context, new String[]{"String"});
您需要一个内部循环,它使用 indexOf(String, int)
遍历每个 hyperText[i]
出现的位置。像这样:
for (int i = 0; i < hyperText.length; i++) {
int pos = 0;
while ((pos = text.indexOf(hyperText[i], pos)) > 0) {
int end = pos + hyperText[i].length();
stringBuilder.setSpan(createSpan(hypertext[i]), pos, end,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
pos = end;
}
}
请注意,这种查找单词匹配项的方法会忽略单词边界和重叠单词/跨度。您可能需要重新考虑...