Изменить цвет подчеркивания в андроиде

Я разрабатываю приложение для Android. Мне нужно подчеркнуть часть Textview.

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

Я использовал приведенный выше код для этого. Но теперь я хочу изменить цвет подчеркивания. Может ли кто-нибудь сказать мне, как это сделать. Любая помощь или предложение принимаются.


person Kushal Shah    schedule 07.10.2011    source источник


Ответы (4)


Не существует документированного метода установки цвета подчеркивания. Однако существует недокументированный метод 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);
        }
    }
}
person kennytm    schedule 08.11.2012
comment
Я попробовал это, и вызов работает, но цвет подчеркивания по-прежнему черный. :( - person Barry Fruitman; 26.01.2013
comment
У меня сработало идеально, на заметку другим: 1.0f — это множитель толщины линии. Значение 1.0 означает толщину по умолчанию, 2.0 будет в два раза толще. - person Andrew Kelly; 06.08.2014
comment
Работает, но цвет и толщина не восстанавливаются из парцелла ( - person Oleksandr Albul; 13.10.2017

Я не пробовал это сам, так что это скорее идея, чем решение, но, вероятно, стоит попробовать. Класс 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 вообще отсутствует (судите сами: http://developer.android.com/reference/android/text/TextPaint.html), поэтому я не уверен, как их использовать.

person Aleks G    schedule 07.10.2011
comment
Я не могу думать ни о чем другом. Почему это не сработает? Вы пробовали? - person Aleks G; 07.10.2011
comment
Причина, по которой это не работает, заключается в том, что updateDrawState только сообщает TextPaint, что это должно быть подчеркнуто. Это не влияет на цвет подчеркивания. UnderlineSpan просто использует цвет текста для цвета подчеркивания. linkColor изменит цвет подчеркивания (и текста) только для ClickableSpan (или URLSpan). - person Suragch; 06.10.2017

В TextPaint есть поле «underlineColor» и метод «setUnderlineText», которые указаны и могут использоваться для изменения цвета подчеркивания. Но это поле и метод '@hide', чтобы использовать их, вы должны использовать отражение, например:

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

ds — это ваш объект TextPaint.

person Gnod    schedule 26.06.2014

Очень поздно столкнуться с этим сценарием. Вот еще один способ: установить несколько диапазонов для одного и того же содержимого:

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);
person Abir Hasan    schedule 20.08.2020
comment
Его изменение цвета текста с подчеркиванием .... не просто подчеркивание - person Ucdemir; 30.03.2021