Java Android为跨距文本添加填充

Java Android为跨距文本添加填充,java,android,android-layout,format,string-formatting,Java,Android,Android Layout,Format,String Formatting,在我的应用程序中,我获取和解析html内容,并使用span显示它。 我使用的跨度如下: String html = "<p>Html Content</p>" Spanned htmlSpan = Html.fromHtml(html, imageParser, null); String html=“html内容” span htmlSpan=Html.fromHtml(Html,imageParser,null); 我曾尝试使用ApacheCommons库设置填充

在我的应用程序中,我获取和解析html内容,并使用span显示它。 我使用的跨度如下:

String html = "<p>Html Content</p>"
Spanned htmlSpan = Html.fromHtml(html, imageParser, null);
String html=“html内容

” span htmlSpan=Html.fromHtml(Html,imageParser,null);
我曾尝试使用ApacheCommons库设置填充,但没有成功

有没有办法设置左右边距


编辑:忘了提一下,我在html内容中也有图像。我曾尝试向文本视图本身添加填充,但这样,所有图像也都有填充。

一般来说,显示HTML的最简单解决方案是使用
WebView
。这不是最好的解决方案,但它也可以与css和javascript一起使用

要在
TextView
中的跨距文本上应用填充,可以使用
,它将
Html.fromHtml()
转换为。如果您不喜欢该span的格式,可以替换它并添加您自己的
LeadingMarginSpan
实现。通过添加一个
TagHandler
来创建和处理您自己在可扩展字符串上的标记,也可以实现同样的效果

您可以使用以下方法搜索和替换跨度

 QuoteSpan[] spans = text.getSpans(0, text.length(), QuoteSpan.class);
text.setSpan(YOUR_SPAN, text.getSpanStart(spans[0]), text.getSpanEnd(spans[0]), 0);

使用spans的文档很少,教程也很少,但您可以进一步阅读。

我选择了艰难的道路

它显示AndroidP开发者预览版将有以下构造函数

QuoteSpan (int color, 
                int stripeWidth, 
                int gapWidth)
真不幸

因此,唯一的方法就是按照David的预期实现一个新的QuoteText。幸运的是,Android是开源的

安卓p的源代码在哪里?我还是找不到它

复制源代码并实现构造函数

import android.graphics.Canvas;
import android.graphics.Paint;
import android.os.Parcel;
import android.support.annotation.ColorInt;
import android.text.Layout;
import android.text.ParcelableSpan;
import android.text.TextUtils;
import android.text.style.LeadingMarginSpan;

// https://android.googlesource.com/platform/frameworks/base/+/master/core/java/android/text/style/QuoteSpan.java
public class MyQuoteSpan implements LeadingMarginSpan, ParcelableSpan {
    private int mStripWidth = 2;
    private int mGapWidth = 2;
    private final int mColor;
    public MyQuoteSpan() {
        super();
        mColor = 0xff0000ff;
    }
    public MyQuoteSpan(@ColorInt int color, int stripeWidth, int gapWidth) {
        super();
        mColor = color;
        mStripWidth = stripeWidth;
        mGapWidth = gapWidth;
    }
    public MyQuoteSpan(Parcel src) {
        mColor = src.readInt();
    }
    public int getSpanTypeId() {
        return getSpanTypeIdInternal();
    }
    /** @hide */
    public int getSpanTypeIdInternal() {
        //return TextUtils.QUOTE_SPAN;
        return 9;
    }
    public int describeContents() {
        return 0;
    }
    public void writeToParcel(Parcel dest, int flags) {
        writeToParcelInternal(dest, flags);
    }
    /** @hide */
    public void writeToParcelInternal(Parcel dest, int flags) {
        dest.writeInt(mColor);
    }
    @ColorInt
    public int getColor() {
        return mColor;
    }
    public int getLeadingMargin(boolean first) {
        return mStripWidth + mGapWidth;
    }
    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 color = p.getColor();
        p.setStyle(Paint.Style.FILL);
        p.setColor(mColor);
        c.drawRect(x, top, x + dir * mStripWidth, bottom, p);
        p.setStyle(style);
        p.setColor(color);
    }
}
最后使用它

String html = "<blockquote>Html Content</blockquote>";
Spannable contentNative;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
   contentNative = (Spannable)Html.fromHtml(content, Html.FROM_HTML_MODE_COMPACT, null, null);
} else {
    contentNative = (Spannable)Html.fromHtml(content, null, null);
}
QuoteSpan[] quoteSpans = contentNative.getSpans(0, contentNative.length(), QuoteSpan.class);
int primaryColor = ResourcesCompat.getColor(getResources(), R.color.colorPrimary, null);
int quoteStripWidth = 2;
int quoteGapWidth = 8;
for (int i = 0, len = quoteSpans.length; i < len; i++) {
    MyQuoteSpan newSpan = new MyQuoteSpan(primaryColor, quoteStripWidth, quoteGapWidth);
    int start = contentNative.getSpanStart(quoteSpans[i]);
    int end = contentNative.getSpanEnd(quoteSpans[i]);
    contentNative.removeSpan(quoteSpans[i]);
    contentNative.setSpan(newSpan, start, end, 0);
}
String html=“html内容”;
西班牙本土的;
if(Build.VERSION.SDK\u INT>=Build.VERSION\u code.N){
contentNative=(Spannable)Html.fromHtml(content,Html.FROM\u Html\u MODE\u COMPACT,null,null);
}否则{
contentNative=(Spannable)Html.fromHtml(content,null,null);
}
QuoteSpan[]QuoteSpan=contentNative.getSpans(0,contentNative.length(),QuoteSpan.class);
int primaryColor=ResourcesCompat.getColor(getResources(),R.color.colorPrimary,null);
int quoteStripWidth=2;
int quoteGapWidth=8;
for(int i=0,len=quoteSpans.length;i
您是否尝试对文本视图应用填充?@DavidMedenjak是。我试过了。问题是,我在html内容中也有图像(对不起,我忘了提到这个问题)。我只想在文本中添加空格谢谢!跨度记录得很差,这让人相当失望。我试过
QuoteSpan
WebView
两种方法,似乎
WebView
对我更有效。你不应该实现
ParcelableSpan
@jL4,那么你认为我应该实现什么呢?@坚决删除它,只实现
leadingspan