在安卓系统中如何更改下划线颜色

10

我正在开发安卓应用程序,需要在一些TextView中添加下划线。

SpannableString content = new SpannableString("Ack:");
content.setSpan(new UnderlineSpan(), 0, content.length(), 0);
tvAck.setText(content);` 

我已经使用了上面的代码。但现在我想改变下划线的颜色。有人能告诉我该如何做吗?任何帮助或建议都可以接受。

4个回答

14

目前没有文档中提供设置下划线颜色的方法。不过,有一种未公开的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);
        }
    }
}

我尝试了这个,调用成功了,但是下划线颜色仍然是黑色。 :( - Barry Fruitman
2
对我来说完美地工作了,提醒其他人的是,1.0f是线条粗细的乘数。1.0的值表示默认粗细,2.0则是两倍粗。 - Andrew Kelly
它可以工作,但是颜色和粗细没有从可包含对象中恢复。 - Oleksandr Albul

3

我自己没有尝试过这个方法,所以这只是一个想法而不是解决方案,但值得尝试。类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);
TextPaintUnderlineSpan的参考文献非常不好,大部分javadoc完全缺失(自行判断:http://developer.android.com/reference/android/text/TextPaint.html),因此我不确定如何使用它们。

我想不出其他的了。为什么它不工作?你试过了吗? - Aleks G
这个不起作用的原因是 updateDrawState 只告诉 TextPaint 应该加下划线,但它并不影响下划线颜色。一个 UnderlineSpan 只使用文本颜色作为下划线颜色。linkColor 只会改变 ClickableSpan(或 URLSpan)的下划线(和文本)颜色。 - Suragch

1
在TextPaint中,有一个字段'underlineColor'和方法'setUnderlineText',分别用于指示并可用于更改下划线颜色。但是,它们都是 '@hide' 字段和方法,如果要使用它们,必须使用反射,例如:
Field field = TextPaint.class.getDeclaredField("underlineColor");
field.setAccessible(true);
field.set(ds, mUnderlineColor);

ds是您的TextPaint对象。


0

真的很晚才遇到这种情况。另一种方法是将多个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);

它可以改变文本颜色并加下划线...不只是下划线。 - Ucdemir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接