2011-10-10 10 views
12

<BlockQuote> HTMLタグをAndroidのテキストビューでフォーマットする方法はありますか?画像、広告、複数の垂直スクロールページで3つの列を簡単に操作できるならば、WebViewsはオプションです。Android TextViewsのスタイルブロック番号

明らかにこのタグを処理すると、ブロッククォートを表すために醜い青い線ができます。ラインの色を変えたり、自分のライン画像を提供する方法はありますか?ありがとう

答えて

18

android.text.Spannableの構築にandroid.text.Html#fromHtmlを使用する場合、はandroid.text.style.QuoteSpanで実装されます。設定が許可されていないのはQuoteSpanです。

最も簡単な解決策は、あなたのSpannable内のすべてのQuoteSpan Sを検索し、それらを交換することです:CustomQuoteSpanクラスなどで

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

これは素晴らしいです、ありがとう! – Nick

+0

ありがとう、私はヒントを追加します。クォートスパン内のテキストに色を付けるには、次のコードを追加してください。spannable.setSpan(new ForegroundColorSpan(0xFF5C5C5C)、start、end、flags); ' – deadfish