Skip to content

TextView ForegroundColorSpan 失效

SpannableStringBuilder先后使用了ClickableSpan和ForegroundColorSpan,ForegroundColorSpan失效问题。 直观表现是没有ForegroundColorSpan的颜色。

以下代码,在某些旧机器上,Android 7,出现此问题。红米6A(8.1.0),一加5(10),均无此问题。

SpannableStringBuilder ssb = new SpannableStringBuilder("my sentence.");
ClickableSpan clickableSpan = new ClickableSpan() {
    @Override
    public void onClick(@NonNull View widget) {
        // ..
    }
};
ssb.setSpan(clickableSpan, start, end, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
ssb.setSpan(new UnderlineSpan(), start, end, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
ssb.setSpan(new ForegroundColorSpan(colorValue), start, end, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);

解决方法

我们查看ForegroundColorSpan源码,发现指定颜色是通过updateDrawState(TextPaint ds)来实现的。 由此想到,在ClickableSpan中顺便指定颜色,不使用ForegroundColorSpan就可以来。

新增一个抽象类ColorClickSpan。里面有一个颜色值。

    public abstract class ColorClickSpan extends ClickableSpan {
        private int color;

        public ColorClickSpan(int color) {
            this.color = color;
        }

        @Override
        public void updateDrawState(TextPaint ds) {
            if (ds != null) {
                ds.setColor(color);
                ds.setUnderlineText(true);
            }
        }
    }

直接使用ColorClickSpan

    ssb.setSpan(new ColorClickSpan(color) {
        @Override
        public void onClick(View widget) {
            // ...
        }
    }, start, end, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);

颜色可以正常显示了。