2011-10-10 8 views
12

Czy istnieje sposób na formatowanie znacznika HTML <BlockQuote> w wyglądzie tekstowym Androida? WebView są opcją, jeśli mogę łatwo manipulować 3 kolumnami obrazami, reklamami i wieloma przewijanymi stronami.Style BlockQuotes w Android TextViews

Widok tekstu oczywiście obsługuje etykietę, dostaję brzydką niebieską linię oznaczającą cytowaną blokadę. Czy istnieje sposób, aby zmienić kolor linii lub jeszcze lepiej zapewnić mój własny obraz linii? Dzięki

Odpowiedz

18

Jeśli użyjesz android.text.Html#fromHtml do zbudowania swojej android.text.Spannable, twoja zostanie zaimplementowana z android.text.style.QuoteSpan. To jest ta QuoteSpan, która nie pozwala na konfigurację.

Najprostszym rozwiązaniem byłoby, aby szukać wszystkich QuoteSpan w twoich Spannable i je wymienić:

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

z CustomQuoteSpan klasy jak:

/** 
* 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

To jest niesamowite, dzięki! – Nick

+0

Dzięki, dodam napiwek. Aby pokolorować tekst w rozpiętości oferty, należy dodać poniższy kod, aby ustawić wartość: spannable.setSpan (new ForegroundColorSpan (0xFF5C5C5C), start, end, flags); – deadfish