import android.content.Context;
import android.support.annotation.ColorRes;
import android.support.annotation.NonNull;
import android.support.annotation.StringRes;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.util.Log;
import android.view.View;
import android.widget.TextView;
/**
* @Author: qqyang
* @Date: 2019/12/27
* @Description:
*/
public class ColorTextUtil {
private static final String TAG = "ColorTextUtil";
private ColorTextUtil() {
}
/**
* 设置 TextView 中部分文字颜色 (不设置 变色文字点击事件).
*/
public static void setColorText(@NonNull TextView tv,
@StringRes int colorTextId,
@ColorRes int colorId) {
setColorText(tv, colorTextId, colorId, null);
}
/**
* 设置 TextView 中部分文字颜色 (不设置 变色文字点击事件).
*/
public static void setColorText(@NonNull TextView tv,
String colorTextStr,
@ColorRes int colorId) {
setColorText(tv, colorTextStr, colorId, null);
}
/**
* 设置 TextView 中部分文字颜色.
*
* @param colorTextId 需要改变颜色的文字的 id。
* @param colorId 改变的颜色
* @param onColorTextClickListener 改变颜色文字的点击事件.
*/
public static void setColorText(@NonNull TextView tv,
@StringRes int colorTextId,
@ColorRes int colorId,
OnColorTextClickListener onColorTextClickListener) {
String allTextStr = tv.getText().toString().trim();
String colorTextStr = tv.getResources().getString(colorTextId);
setColorTextClick(tv, allTextStr, colorTextStr, colorId, onColorTextClickListener);
}
/**
* 设置 TextView 中部分文字颜色.
*
* @param colorText 需要改变颜色的文字
* @param colorId 改变的颜色
* @param onColorTextClickListener 改变颜色文字的点击事件.
*/
public static void setColorText(@NonNull TextView tv,
String colorText,
@ColorRes int colorId,
OnColorTextClickListener onColorTextClickListener) {
String allTextStr = tv.getText().toString().trim();
setColorTextClick(tv, allTextStr, colorText, colorId, onColorTextClickListener);
}
/**
* 设置 TextView 中部分文字颜色.
*
* @param allTextStr 全部文字
* @param colorTextStr 需要改变颜色的文字
* @param colorId 改变的颜色
* @param onColorTextClickListener 改变颜色文字的点击事件.
*/
public static void setColorTextClick(TextView tv,
String allTextStr,
String colorTextStr,
@ColorRes int colorId,
OnColorTextClickListener onColorTextClickListener) {
Log.i(TAG, "allTextStr: " + allTextStr);
Log.i(TAG, "colorTextStr: " + colorTextStr);
if (!allTextStr.contains(colorTextStr)) {
Log.e(TAG, allTextStr + " 不包含 " + colorTextStr + " 文字!!!!");
return;
}
Context context = tv.getContext();
int start = allTextStr.indexOf(colorTextStr);
int end = start + colorTextStr.length();
SpannableString spanText = new SpannableString(allTextStr);
spanText.setSpan(new ClickableSpan() {
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(context.getResources().getColor(colorId)); //设置文字颜色
ds.setUnderlineText(false);
}
@Override
public void onClick(View view) {
if (null != onColorTextClickListener) {
onColorTextClickListener.onColorTextClick(view);
}
}
}, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setHighlightColor(context.getResources().getColor(R.color.transparent));// 设置点击后的颜色为透明,否则会一直出现高亮
tv.setText(spanText);
tv.setMovementMethod(LinkMovementMethod.getInstance());// 设置变色文字点击事件
}
public static interface OnColorTextClickListener {
void onColorTextClick(View view);
}
}