Suraj的答案很棒并且有效,但是缺少两个组件。首先,它不会突出显示第一个单词(就像Rany所评论的那样),其次,它不区分大小写,因此在这个字符串中搜索"test"
将找不到任何内容: "This is a Test"
。
这是我的更新答案,通过传递参数解决了这两个问题,并添加了alpha以便您可以为突出显示使用自定义颜色。请注意,重载的第一个方法是一个示例,用于返回先前方法所做的除选择第一项之外的所有内容。
public static SpannableString buildHighlightString(String originalText, String textToHighlight){
return buildHighlightString(originalText, textToHighlight, false, Color.YELLOW, 1.0F);
}
public static SpannableString buildHighlightString(String originalText, String textToHighlight,
boolean ignoreCase, @ColorInt int highlightColor,
@FloatRange(from = 0.0, to = 1.0) float colorAlpha){
SpannableString spannableString = new SpannableString(originalText);
if (TextUtils.isEmpty(originalText) || TextUtils.isEmpty(textToHighlight)) {
return spannableString;
}
String lowercaseOriginalString = originalText.toLowerCase();
String lowercaseTextToHighlight = textToHighlight.toLowerCase();
if(colorAlpha < 1){
highlightColor = ColorUtils.setAlphaComponent(highlightColor, ((int)(255*colorAlpha)));
}
BackgroundColorSpan[] backgroundSpans = spannableString.getSpans(0, spannableString.length(), BackgroundColorSpan.class);
for (BackgroundColorSpan span: backgroundSpans) {
spannableString.removeSpan(span);
}
int indexOfKeyword = (ignoreCase)
? lowercaseOriginalString.indexOf(lowercaseTextToHighlight)
: originalText.indexOf(textToHighlight);
while (indexOfKeyword != -1) {
spannableString.setSpan(new BackgroundColorSpan(highlightColor), indexOfKeyword,
indexOfKeyword + (textToHighlight.length()), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
indexOfKeyword = (ignoreCase)
? lowercaseOriginalString.indexOf(lowercaseTextToHighlight, (indexOfKeyword) + textToHighlight.length())
: originalText.indexOf(textToHighlight, (indexOfKeyword) + textToHighlight.length());
}
return spannableString;
}