10

我正在开发安卓应用程序。我需要强调一些Textview。

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

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

4

4 回答 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);
        }
    }
}
于 2012-11-08T10:43:52.807 回答
3

我自己没有尝试过,所以这更像是一个想法而不是解决方案,但可能值得尝试。类UnderlineSpan有方法updateDrawState,它TextPaint作为参数。反过来, TextPain 可以有 field 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),所以我不确定如何使用这些尽管。

于 2011-10-07T08:17:58.747 回答
1

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

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

ds 是您的 TextPaint 对象。

于 2014-06-26T08:30:54.663 回答
0

遇到这种情况真的晚了。这是另一种方式,它将多个跨度设置为相同的可跨度内容:

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);
于 2020-08-20T07:47:11.007 回答