在段落中多次跨越特定字符串

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;
    }
}

请注意,这种查找单词匹配项的方法会忽略单词边界和重叠单词/跨度。您可能需要重新考虑...