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:
- Cómo establecer varias extensiones en un texto de TextView (clicable y en negrita)
- Creación de softkey con emoji personalizado
- Espaciado de párrafos con SpannableStringBuilder en TextView
- Android SpannableString establecer fondo detrás de parte del texto
- Alinear mapa de bits en SpannableStringBuilder
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?
- TextView fromHtml enlaces rotos en Lollipop
- Android - Agregar margen para SpannableStringBuilder con ReplacementSpan
- Reemplace los caracteres con Image en string y luego seleccione Textview
- Cadena spannable para Android con espaciado de líneas
- StringIndexOutOfBoundsException de SpannableStringInternal
- Spannablestring no funciona para el botón creado mediante programación
- SpannableString: ¿Es posible aplicar dos o más RelativeSizeSpans?
- Establecer arrastrar audiencia en SpannableString
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?
- Sustituyendo glReadPixels por EGL_KHR_image_base para una copia de píxeles más rápida
- Android – después de cargar URL con webview puedo cambiar el color de fondo