2011-10-10 7 views
12

¿Hay alguna manera de formatear la etiqueta HTML <BlockQuote> dentro de una vista de texto de Android? Las vistas web son una opción si puedo manipular fácilmente 3 columnas con imágenes, anuncios y múltiples páginas verticales de desplazamiento.Style BlockQuotes en Android TextViews

La vista de texto obviamente maneja la etiqueta, obtengo una línea azul fea para denotar la blockquote. ¿Hay alguna manera de cambiar el color de la línea o mejor aún proporcionar mi propia imagen de línea? Gracias

Respuesta

18

Si usa android.text.Html#fromHtml para construir su android.text.Spannable, su se implementará con android.text.style.QuoteSpan. Es este QuoteSpan que no permite la configuración.

La solución más sencilla sería la de buscar todas las QuoteSpan s en su Spannable y reemplazarlos:

private void replaceQuoteSpans(Spannable spannable) { 
    QuoteSpan[] quoteSpans = spannable.getSpans(0, spanned.length(), QuoteSpan.class); 
    for (QuoteSpan quoteSpan : quoteSpans) { 
     int start = spannable.getSpanStart(quoteSpan); 
     int end = spannable.getSpanEnd(quoteSpan); 
     int flags = spannable.getSpanFlags(quoteSpan); 
     spannable.removeSpan(quoteSpan); 
     spannable.setSpan(new CustomQuoteSpan(
       MY_BACKGROUND_COLOR, 
       MY_STRIPE_COLOR, 
       MY_STRIPE_WIDTH, 
       MY_GAP_WIDTH), 
      start, 
      end, 
      flags); 
    } 
} 

con un CustomQuoteSpan clase como:

/** 
* android.text.style.QuoteSpan hard-codes the strip color and gap. :(
*/ 
public class CustomQuoteSpan implements LeadingMarginSpan, LineBackgroundSpan { 
    private final int backgroundColor; 
    private final int stripeColor; 
    private final float stripeWidth; 
    private final float gap; 

    public CustomQuoteSpan(int backgroundColor, int stripeColor, float stripeWidth, float gap) { 
     this.backgroundColor = backgroundColor; 
     this.stripeColor = stripeColor; 
     this.stripeWidth = stripeWidth; 
     this.gap = gap; 
    } 

    @Override 
    public int getLeadingMargin(boolean first) { 
     return (int) (stripeWidth + gap); 
    } 

    @Override 
    public void drawLeadingMargin(Canvas c, Paint p, int x, int dir, int top, int baseline, int bottom, 
            CharSequence text, int start, int end, boolean first, Layout layout) { 
     Paint.Style style = p.getStyle(); 
     int paintColor = p.getColor(); 

     p.setStyle(Paint.Style.FILL); 
     p.setColor(stripeColor); 

     c.drawRect(x, top, x + dir * stripeWidth, bottom, p); 

     p.setStyle(style); 
     p.setColor(paintColor); 
    } 

    @Override 
    public void drawBackground(Canvas c, Paint p, int left, int right, int top, int baseline, int bottom, CharSequence text, int start, int end, int lnum) { 
     int paintColor = p.getColor(); 
     p.setColor(backgroundColor); 
     c.drawRect(left, top, right, bottom, p); 
     p.setColor(paintColor); 
    } 
} 
+0

Esto es impresionante, gracias! – Nick

+0

Gracias, añadiré consejo. Para colorear el texto en el lapso entre comillas, agregue a continuación el siguiente código spanse setting span span' spannable.setSpan (new ForegroundColorSpan (0xFF5C5C5C), start, end, flags); ' – deadfish

Cuestiones relacionadas