Textview 部分文字改变大小, 下划线, 颜色与点击事件
程序员文章站
2023-12-24 19:04:15
...
参考 :
1. https://blog.csdn.net/lowprofile_coding/article/details/48138073
2. https://blog.csdn.net/singwhatiwanna/article/details/18363899
需要注意的是, 使用这个方式后, 设置特殊效果的文字会拦截点击事件, 如果是父布局统一带了点击事件时, 会导致点击 TextView 不会响应父布局事件. 必须再单独为这个TextView再设置一次点击事件. 并且注意顺序, 先设置文字效果, 再设置点击事件.
public class TextViewUtils {
/**
* 设置部分文字加下划线, 特殊颜色, 及点击效果
* @param tv 传入的TextView
* @param strId 传入 TextView 需要展示的文字在string.xml中的id
* @param underLine 是否显示下划线
* @param color 部分特殊文字的颜色 传入-1 默认为蓝色
* @param start 特殊文字从哪个位置开始 传入 -1 则从文字最开始设置
* @param end 特殊文字从哪个位置结束 传入 -1 则默认设置到文字最后
* @param textSize 文字大小sp 传入 > 0 的 sp 值
* @param listener 传入自定义点击监听器 不需要时传 null 即可
*/
public static void setSpan(TextView tv,
@StringRes int strId,
final boolean underLine,
@ColorRes final int color,
int start,
int end,
int textSize,
final View.OnClickListener listener){
final Context context = MyApplication.getContext();
tv.setHighlightColor(ContextCompat.getColor(context, android.R.color.transparent));
String str = context.getString(strId);
SpannableString info = new SpannableString(str);
int startNum = (start <= -1) ? 0 : start;
int endNum = (end <= -1) ? str.length() : end;
if (textSize > 0){
info.setSpan(new AbsoluteSizeSpan(sp2px(context, textSize)), startNum,
endNum, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
info.setSpan(new ClickableSpan() {
/**
* 重写父类点击事件
*/
@Override
public void onClick(View widget) {
if (listener != null) {
listener.onClick(widget);
}
}
/**
* 重写父类updateDrawState方法 我们可以给TextView设置字体颜色,背景颜色等等...
*/
@Override
public void updateDrawState(TextPaint ds) {
int colorRes = color;
if(color == -1) colorRes = Color.BLUE;
ds.setColor(ContextCompat.getColor(context, colorRes));
ds.setUnderlineText(underLine);
}
}, startNum,
endNum, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(info);
tv.setMovementMethod(LinkMovementMethod.getInstance());
}
private static int sp2px(Context context, float spValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
}