2011-10-10 21 views
12

Bir Android textview içinde <BlockQuote> HTML etiketini biçimlendirmenin bir yolu var mı? Resimler, reklamlar ve çoklu dikey kaydırma sayfaları ile 3 sütunu kolayca kullanabiliyorsanız WebViews bir seçenektir.Style BlockQuotes in Android TextViews

Metin görünümü açıkça etiketi işliyor, blockquote belirtmek için çirkin bir mavi çizgi alıyorum. Çizginin rengini değiştirmenin veya daha iyi bir şekilde kendi çizgi resmimi sağlamanın bir yolu var mı? Teşekkürler

cevap

18

android.text.Spannable oluşturmak için android.text.Html#fromHtml kullanırsanız, android.text.style.QuoteSpan ile uygulanır. Yapılandırmaya izin vermeyen bu QuoteSpan'dur.

en kolay çözüm Spannable tüm QuoteSpan s için arama ve bunları değiştirmek şeklinde olur: Bir CustomQuoteSpan sınıf gibi olan

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

:

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

Bu harika, teşekkürler! – Nick

+0

Teşekkürler, ipucu ekleyeceğim. Alıntı kapsamındaki metni renklendirmek için aşağıdaki kodu yazınız: bel spredable.setSpan (yeni ForegroundColorSpan (0xFF5C5C5C), start, end, flags); – deadfish