2011-10-10 73 views
12

有没有在Android textview中格式化<BlockQuote>HTML标记的方法?如果我可以通过图像,广告和多个垂直滚动页面轻松操作3列,则WebView是一个选项。Android TextViews中的样式块引用

文本视图显然处理标记,我得到一个丑陋的蓝线表示块引用。有没有办法改变线条的颜色或更好地提供我自己的线条图像?由于

回答

18

如果使用android.text.Html#fromHtml建立你android.text.Spannable,您将与android.text.style.QuoteSpan实现。正是这个QuoteSpan不允许配置。

最简单的解决办法是在你的Spannable搜索所有QuoteSpan S和替换它们:

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

CustomQuoteSpan类,如:

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

这是真棒,谢谢! – Nick

+0

谢谢,我会加小费。要在报价范围内给文本添加颜色,请在下面添加代码belose setting quote span'spannable.setSpan(new ForegroundColorSpan(0xFF5C5C5C),start,end,flags);' – deadfish