10
votes

Changer la couleur du soulignement dans Android

Je développe l'application Android. J'ai besoin de souligner une partie du texteView.

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


0 commentaires

4 Réponses :


3
votes

Je n'ai pas essayé cela moi-même, c'est donc plus une idée qu'une solution, mais vaut probablement la peine d'être essayée. Classe Sous-litline a la méthode mise à jour de la méthodeDawstate , qui prend textpaint comme paramètre. À son tour, TextPain peut avoir champ Public int LinkColor .

Donc, ce serait quelque chose comme xxx

référence pour les deux TextPaint et Sous-litline sont très pauvres, la majorité de Javadoc manquant complètement (juge pour vous-même: http://developer.android.com/reference/andrroid/text/textpaint.html ), donc je ne suis pas certain de les utiliser.


2 commentaires

Je ne peux penser à rien d'autre. Pourquoi ça ne marchera-t-il pas? L'avez-vous essayé?


La raison pour laquelle cela ne fonctionne pas est que updatedatedawstate n'indique que le texte textpaint qu'il doit être souligné. Cela n'affecte pas la couleur de soulignement. Un Sous-litline utilise simplement la couleur de texte pour la couleur de soulignement. Le linkcolor modifierait la couleur du soulignement (et du texte) uniquement pour un clickableespan (ou urlspan ).



14
votes

Il n'y a pas de méthode documentée pour définir la couleur de soulignement. Toutefois, il existe un TextPaint.sewunderline (int, float) float) qui vous permet de fournir la couleur et l'épaisseur de soulignement:

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


3 commentaires

J'ai essayé cela et l'invocation fonctionne, mais la couleur soulignée est toujours noire. :(


Travaillé parfaitement pour moi, comme une note aux autres, le 1.0f est le multiplicateur d'épaisseur de la ligne. Une valeur de 1.0 signifie une épaisseur par défaut, 2,0 serait deux fois plus épais.


Cela fonctionne, mais la couleur et l'épaisseur ne sont pas restaurées à partir de



1
votes

Dans TextPaint, il existe un champ «Sous-ligne» et Méthode 'SederlinNetext », indiqués et peuvent utiliser pour modifier la couleur de soulignement. Mais, ils sont du champ et de la méthode @hide ', de les utiliser, vous devez utiliser réfléchissant, comme celui-ci:

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


0 commentaires

0
votes

vraiment tard pour rencontrer ce scénario. Voici une autre façon, il serait de définir plusieurs couvre-mains sur le même contenu et le même contenu:

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


1 commentaires

Sa couleur de texte de changement avec soulignement ... non seulement souligner