Стиль BlockQuotes в Android TextViews

Есть ли способ отформатировать <BlockQuote> HTML-тег в текстовом представлении Android? WebViews - вариант, если я могу легко манипулировать 3 колонками с изображениями, рекламой и несколькими вертикальными страницами прокрутки.

Текстовое представление, очевидно, обрабатывает тег, я получаю уродливую синюю линию для обозначения цитаты. Есть ли способ изменить цвет линии или еще лучше предоставить собственное изображение линии? Спасибо

1 ответ

Если вы используете android.text.Html#fromHtml построить свой android.text.Spannable, ваш blockquote will be implemented with android.text.style.QuoteSpan, Именно это QuoteSpan that doesn't allow configuration.

The easiest solution would be to search for all the QuoteSpanв вашем Spannable and replace them:

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);
    }
}
Другие вопросы по тегам