2011-10-07 35 views
5

Estoy desarrollando la aplicación para Android. Necesito subrayar algo de Textview.Cambiar el color del subrayado en android

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

He utilizado el código de arriba para eso. Pero ahora quiero cambiar el color del subrayado. ¿Alguien puede decirme cómo hacerlo? Cualquier ayuda o sugerencia es aceptada.

Respuesta

3

No he probado esto por mí mismo, así que esto es más una idea que una solución, pero probablemente valga la pena intentarlo. La clase UnderlineSpan tiene el método updateDrawState, que toma TextPaint como parámetro. A su vez, TextPain puede tener el campo public int linkColor.

Así que para usted sería algo así como

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

de referencia tanto para TextPaint y UnderlineSpan son muy pobres, la mayoría de javadoc faltan por completo (juzguen ustedes mismos: http://developer.android.com/reference/android/text/TextPaint.html), así que no estoy seguro de cómo para usar estos sin embargo.

+0

no funcionará si tiene más sugerencias. –

+0

No puedo pensar en nada más. ¿Por qué no funciona? ¿Lo intentaste? –

+0

sí, tengo. Pero no cambiará el color del subrayado. –

5

No hay un método documentado para establecer el color de subrayado. Sin embargo, hay un TextPaint.setUnderline(int, float) método indocumentado que permite usted provee el color de subrayado y grosor:

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

Intenté esto y la invocación funciona, pero el color de subrayado sigue siendo negro. :( –

+2

Funcionó perfectamente para mí, como una nota para los demás el 1.0f es el multiplicador de grosor de línea. Un valor de 1.0 significa grosor predeterminado, 2.0 sería el doble de grueso. –

+0

Funciona, pero el color y el grosor no se restauran desde parcelable ( –

1

En TextPaint, tiene un campo 'underlineColor' y el método 'setUnderlineText', se indica y se puede utilizar para cambiar el subrayado color. Pero, son campo '@hide' y el método, a usarlos, se debe utilizar lo que refleja, como esto:

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

ds es su TextPaint objeto.

Cuestiones relacionadas