我正在开发安卓应用程序,需要在一些TextView中添加下划线。
SpannableString content = new SpannableString("Ack:");
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
tvAck.setText(content);`
我已经使用了上面的代码。但现在我想改变下划线的颜色。有人能告诉我该如何做吗?任何帮助或建议都可以接受。
目前没有文档中提供设置下划线颜色的方法。不过,有一种未公开的TextPaint.setUnderline(int, float)
方法可以让你自定义下划线的颜色和粗细:
final class ColoredUnderlineSpan extends CharacterStyle
implements UpdateAppearance {
private final int mColor;
public ColoredUnderlineSpan(final int color) {
mColor = color;
}
@Override
public void updateDrawState(final TextPaint tp) {
try {
final Method method = TextPaint.class.getMethod("setUnderlineText",
Integer.TYPE,
Float.TYPE);
method.invoke(tp, mColor, 1.0f);
} catch (final Exception e) {
tp.setUnderlineText(true);
}
}
}
我自己没有尝试过这个方法,所以这只是一个想法而不是解决方案,但值得尝试。类UnderlineSpan
有一个updateDrawState
方法,它需要一个TextPaint
作为参数。而TextPaint可以有一个public int linkColor
字段。
因此,对于你来说,应该做如下操作:
TextPaint tp = new TextPaint();
tp.linkColor = [your color]; //not quite sure what the format should be
UnderlineSpan us = new UnderlineSpan();
us.updateDrawState(tp);
SpannableString content = new SpannableString("Ack:");
content.setSpan(us, 0, content.length(), 0); tvAck.setText(content);
TextPaint
和UnderlineSpan
的参考文献非常不好,大部分javadoc完全缺失(自行判断:http://developer.android.com/reference/android/text/TextPaint.html),因此我不确定如何使用它们。updateDrawState
只告诉 TextPaint
应该加下划线,但它并不影响下划线颜色。一个 UnderlineSpan
只使用文本颜色作为下划线颜色。linkColor
只会改变 ClickableSpan
(或 URLSpan
)的下划线(和文本)颜色。 - SuragchField field = TextPaint.class.getDeclaredField("underlineColor");
field.setAccessible(true);
field.set(ds, mUnderlineColor);
ds是您的TextPaint对象。
真的很晚才遇到这种情况。另一种方法是将多个span设置为相同的可跨度内容:
SpannableString content = new SpannableString("Ack:");
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
content.setSpan(
new ForegroundColorSpan(ContextCompat.getColor(context, R.color.red)),
0,
content.length(),
0
);
tvAck.setText(content, TextView.BufferType.SPANNABLE);