问题描述
我试图在段落中显示的任何地方跨越相同的字符串。但问题是它跨越段落中匹配的唯一第一个字符串。
e.g 你好,这是我在段落中的字符串。字符串是可变的。
在这种情况下,我想在行或段落中的任何地方使用“字符串”一词。在当前的实现中,它只在第一次与段落匹配时才跨越,而不检查段落的其余部分。请帮我解决这个问题。
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;
}
}
请注意,这种查找单词匹配项的方法会忽略单词边界和重叠单词/跨度。您可能需要重新考虑...