ForegroundColorSpan no se aplica a ReplacementSpan

Estoy tratando de utilizar ReplacementSpans para dar formato a la entrada en un campo EditText (sin modificar el contenido):

public class SpacerSpan extends ReplacementSpan { @Override public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) { return (int) paint.measureText(text.subSequence(start,end)+" "); } @Override public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) { canvas.drawText(text.subSequence(start,end)+" ", 0, 2, x, y, paint); } } 

Esto funciona como se espera y añade espacio después de la sección abarcada. Sin embargo, si también aplico un ForegroundColorSpan el color no está establecido para la sección abarcada:

 EditText edit = (EditText) findViewById(R.id.edit_text); SpannableString content = new SpannableString("1234567890"); ForegroundColorSpan fontColor = new ForegroundColorSpan(Color.GREEN); SpacerSpan spacer = new SpacerSpan(); content.setSpan(fontColor, 0, content.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); content.setSpan(spacer, 4, 5, Spanned.SPAN_MARK_MARK); edit.setText(content); 

El resultado parece http://i.cubeupload.com/4Us5Zj.png

Si aplico un AbsoluteSizeSpan, el tamaño de fuente especificado también se aplica a la sección Span de reemplazo. ¿Es este el comportamiento deseado, me falta algo, o un error en android?

CommonWare me señaló en la dirección correcta. Parece que ReplacementSpans se procesan antes de consultar cualquier CharacterStyleSpan [1]

Una posible (pero fea) solución es implementar un Custom MetricAffectingSpan que extiende MetricAffectingSpan (MetricAffectingSpans se consultan antes de ReplacementSpans se dibujan [1]).

 public class FontColorSpan extends MetricAffectingSpan { private int mColor; public FontColorSpan(int color) { mColor = color; } @Override public void updateMeasureState(TextPaint textPaint) { textPaint.setColor(mColor); } @Override public void updateDrawState(TextPaint textPaint) { textPaint.setColor(mColor); } } 

Supongo que este es un error que debe ser reportado?

[1] http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.2_r1/android/text/TextLine.java#936

  • ¿Hay alguna manera de insertar un ImageSpan en un TextView sin interrumpir el texto?
  • Cómo configurar la fuente personalizada para palabra en un texto TextView
  • Combinación de Spannable con String.format ()
  • Establecer una fuente y un color diferentes a parte de un TextView
  • Las extensiones de vínculo se pierden de la conversión de ListView
  • Ajuste de la alineación del texto mediante SpannableString
  • SpannableString no funciona cuando se utiliza el tema de AppCompat
  • A veces, las extensiones de la imagen no son visibles cuando el contenido cubre varias líneas en la vista de texto
  • Cambiar altura de línea / línea en EditText en un nivel de carácter
  • ¿Cómo puedo utilizar onTouchListeners en cada palabra en un TextView?
  • Android Development: Cómo reemplazar parte de un EditText con un Spannable
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.