在android中更改下划线的颜色

在android中更改下划线的颜色,android,underline,Android,Underline,我正在开发android应用程序。我需要在Textview的某些部分下面加下划线 SpannableString content = new SpannableString("Ack:"); content.setSpan(new UnderlineSpan(), 0, content.length(), 0); tvAck.setText(content);` 我已经使用了上面的代码。但是现在我想改变下划线的颜色。谁能告诉我怎么做。任何帮助或建议都会被接受。我自己没有尝试过,所以这更像是一

我正在开发android应用程序。我需要在Textview的某些部分下面加下划线

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

我已经使用了上面的代码。但是现在我想改变下划线的颜色。谁能告诉我怎么做。任何帮助或建议都会被接受。

我自己没有尝试过,所以这更像是一个想法,而不是一个解决方案,但可能值得尝试。类
UnderlineSpan
具有方法
updateDrawState
,该方法将
TextPaint
作为参数。反过来,TextPain可以具有字段
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都不见了(请自己判断:),所以我不确定如何使用它们。

没有文档记录的设置下划线颜色的方法。但是,有一种未记录的
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);
        }
    }
}

在TextPaint中,有一个字段“underlineColor”和方法“setUnderlineText”,指示并可用于更改下划线颜色。但是,它们是'@hide'字段和方法,要使用它们,必须使用反射,如下所示:

Field field = TextPaint.class.getDeclaredField("underlineColor");
field.setAccessible(true);
field.set(ds, mUnderlineColor);

ds是您的TextPaint对象。

遇到这种场景真的太晚了。另一种方法是,将多个跨距设置为相同的可跨距内容:

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);

我想不出别的了。为什么不起作用?你试过了吗?这不起作用的原因是
updateDrawState
只告诉
TextPaint
它应该加下划线。它不影响下划线颜色。
下划线span
只使用文本颜色作为下划线颜色。
linkColor
将仅为
可点击span
(或
urlsspan
)更改下划线(和文本)的颜色。我尝试了此操作,调用正常,但下划线颜色仍然为黑色:(对我来说效果很好,请注意,1.0f是线条厚度倍增。值1.0表示默认厚度,2.0表示厚度的两倍。它可以工作,但颜色和厚度不会从parcelable恢复(它的更改文本颜色带有下划线…而不仅仅是下划线)