在android中更改下划线的颜色

Posted

技术标签:

【中文标题】在android中更改下划线的颜色【英文标题】:Change the color of the underline in android 【发布时间】:2011-12-02 19:54:24 【问题描述】:

我正在开发安卓应用程序。我需要在一些 Textview 下划线。

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

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

我试过这个并且调用有效,但下划线颜色仍然是黑色。 :( 对我来说非常适合,作为对其他人的说明,1.0f 是线宽乘数。值 1.0 表示默认厚度,2.0 将是厚度的两倍。 可以,但是颜色和厚度没有从parcelable中恢复(【参考方案2】:

我自己没有尝试过,所以这更像是一个想法而不是解决方案,但可能值得尝试。类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);

TextPaintUnderlineSpan 的参考非常差,大部分 javadoc 完全缺失(请自行判断:http://developer.android.com/reference/android/text/TextPaint.html),所以我不确定如何使用它们。

【讨论】:

我想不出别的了。为什么它不起作用?你试过了吗? 这不起作用的原因是updateDrawState 只告诉TextPaint 它应该加下划线。它不影响下划线颜色。 UnderlineSpan 只使用文本颜色作为下划线颜色。 linkColor 只会更改 ClickableSpan(或 URLSpan)的下划线(和文本)的颜色。【参考方案3】:

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

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

ds 是您的 TextPaint 对象。

【讨论】:

【参考方案4】:

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

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

【讨论】:

它用下划线改变文本颜色......不仅仅是下划线

以上是关于在android中更改下划线的颜色的主要内容,如果未能解决你的问题,请参考以下文章

Android TextView中的下划线和更改文本颜色[重复]

Android Spinner 下划线颜色

如何更改 TextInputEditText 中的默认下划线颜色

EditText下划线禁用颜色[重复]

如何在 MD Bootstrap 中更改输入组件的下划线颜色

如何在 Material UI 中更改 Select 的文本、图标和下划线颜色