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

问题描述

我试图在段落中显示的任何地方跨越相同的字符串。但问题是它跨越段落中匹配的唯一第一个字符串。

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

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...