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

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

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

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

【问题讨论】:

    标签: android underline


    【解决方案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);
      

      【讨论】:

      • 它用下划线改变文本颜色......不仅仅是下划线
      猜你喜欢
      • 2012-09-15
      • 2015-04-08
      • 2017-07-23
      • 1970-01-01
      • 2021-04-30
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      相关资源
      最近更新 更多