如果只是单纯的想让TextView中部分文字高亮显示,下面两个方法就行了:
/**
* 关键字高亮变色
*
* @param color
* 变化的色值
* @param text
* 文字
* @param keyword
* 文字中的关键字
* @return
*/
public static SpannableString matcherSearchTitle(int color, String text, String keyword) {
SpannableString s = new SpannableString(text);
Pattern p = Pattern.compile(keyword);
Matcher m = p.matcher(s);
while (m.find()) {
int start = m.start();
int end = m.end();
s.setSpan(new ForegroundColorSpan(color), start, end,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
return s;
}
/**
* 多个关键字高亮变色
*
* @param color
* 变化的色值
* @param text
* 文字
* @param keyword
* 文字中的关键字数组
* @return
*/
public static SpannableString matcherSearchTitle(int color, String text, String[] keyword) {
SpannableString s = new SpannableString(text);
for (int i = 0; i < keyword.length; i++) {
Pattern p = Pattern.compile(keyword[i]);
Matcher m = p.matcher(s);
while (m.find()) {
int start = m.start();
int end = m.end();
s.setSpan(new ForegroundColorSpan(color), start, end,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
return s;
}
}
但是如果既想让部分文字高亮且该部分文字可以响应点击事件,则需要按照以下步骤:
①继承ClickableSpan:
public class MyClickSpan extends ClickableSpan
{
private int mHighLightColor = Color.RED;
private boolean mUnderLine = false;
private View.OnClickListener mClickListener;
public MyClickSpan(View.OnClickListener listener)
{
this.mClickListener = listener;
}
public MyClickSpan(int color, boolean underline, View.OnClickListener listener)
{
this.mHighLightColor = color;
this.mUnderLine = underline;
this.mClickListener = listener;
}
@Override
public void onClick(View widget)
{
if (mClickListener != null)
mClickListener.onClick(widget);
}
@Override
public void updateDrawState(TextPaint ds)
{
ds.setColor(mHighLightColor);
ds.setUnderlineText(mUnderLine);
}
}
②调用下面的方法即可:
public static void setTextHighLightWithClick(TextView tv, String text
, String keyWord, View.OnClickListener listener)
{
tv.setClickable(true);
tv.setHighlightColor(Color.TRANSPARENT);
tv.setMovementMethod(LinkMovementMethod.getInstance());
SpannableString s = new SpannableString(text);
Pattern p = Pattern.compile(keyWord);
Matcher m = p.matcher(s);
while (m.find())
{
int start = m.start();
int end = m.end();
s.setSpan(new MyClickSpan(listener), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
tv.setText(s);
}