HTML.fromHtml在文本末尾添加空格?

在我的应用程序中,我使用Html.fromHtml(string).toString方法删除在解析一些JSON时收到的一些

标记。

如果我保留

标签,则文本完全适合背景(背景是相对布局,高度和宽度都包含wrap_content。)但是,如果我使用fromHtml删除

标签,则突然有一个文本下面的空间很大,我相信是从最后添加空间的fromHtml方法?

有任何想法吗?

编辑:

以下是截图: http : //imgur.com/a/zIZNo

带有

标签的那个显然是没有使用fromHtml的那个! 🙂

编辑2:已find解决方案,请参阅下面的答案。 感谢Andro Selva通过告诉我正在添加的隐藏/n来帮助我!

解决方案被发现:

fromHtml返回Spannedtypes。 所以我分配了返回给variables的内容,将其转换为字符串,然后在其上使用.trim()方法。

它最后删除了所有空白区域。

是的,你的想法是非常正确的。 它为底部增加了空间。 但在此之前,让我解释一下这是如何工作的。

您必须查看HTML类以了解它的工作原理。

简单来说,这就是它的工作原理:每当你的Html类看到

标签时,它所做的只是在末尾附加两个“\ n”字符。

在这种情况下,您在底部看到的空白空间实际上是因为两个\ n附加到paragaraph的末尾。

我已经添加了负责此操作的Html类的实际方法,

  private static void handleP(SpannableStringBuilder text) { int len = text.length(); if (len >= 1 && text.charAt(len - 1) == '\n') { if (len >= 2 && text.charAt(len - 2) == '\n') { return; } text.append("\n"); return; } if (len != 0) { text.append("\n\n"); } } 

如果要覆盖此操作,则必须覆盖Html类本身,这有点棘手,无法在此处完成。

编辑

这是Html类的链接,

Html类

如果您尝试在对象中使用它或尝试将其放在特定位置,请尝试使用标签而不是

在最后添加返回托架,写入无,但您有要记住用来写自己,你就可以保持风格

@Andro Selva的解释是正确的,没有太多可行的事情。 令人沮丧的是,对于API 24以及随后在调用中包含标志的事情变得更好

 Spanned fromHtml (String source, int flags, Html.ImageGetter imageGetter, Html.TagHandler tagHandler); 

我怀疑FROM_HTML_SEPARATOR_LINE_BREAK_PARAGRAPH标志会将标准段落终止的双倍“\ n \ n”减少为换行符的单个“\ n”

考虑到Android版本的历史〜我不能专门为Android API 24+编写软件! 所以……我find了一个包含2个额外自定义标签的kludge解决方案。

 1. ...  2. ...  

两者都通过此方法调用RelativeSizeSpan类

 private void ProcessRelativeSizeTag(float scalefactor, boolean opening, Editable output) { int len = output.length(); if (opening) { System.out.println("scalefactor open: " + scalefactor); output.setSpan(new RelativeSizeSpan(scalefactor), len, len, Spannable.SPAN_MARK_MARK); } else { Object obj = getLast(output, RelativeSizeSpan.class); int where = output.getSpanStart(obj); scalefactor = ((RelativeSizeSpan)obj).getSizeChange(); output.removeSpan(obj); System.out.println("scalefactor close: " + scalefactor); if (where != len) { output.setSpan(new RelativeSizeSpan(scalefactor), where, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } } 

从提供给Html.fromHtml方法的自定义TagHandler Html.fromHtml ,即:

 private static class CustomTagHandler implements Html.TagHandler { private void ProcessRelativeSizeTag(float scalefactor, boolean opening, Editable output) { int len = output.length(); if (opening) { //mSizeStack.push(scalefactor); System.out.println("scalefactor open: " + scalefactor); output.setSpan(new RelativeSizeSpan(scalefactor), len, len, Spannable.SPAN_MARK_MARK); } else { Object obj = getLast(output, RelativeSizeSpan.class); int where = output.getSpanStart(obj); scalefactor = ((RelativeSizeSpan)obj).getSizeChange(); output.removeSpan(obj); //scalefactor = (float)mSizeStack.pop(); System.out.println("scalefactor close: " + scalefactor); if (where != len) { output.setSpan(new RelativeSizeSpan(scalefactor), where, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); } } } ... final HashMap mAttributes = new HashMap<>(); @Override public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) { String Attr; processAttributes(xmlReader); if ("default".equalsIgnoreCase(tag)) { ProcessRelativeSizeTag(mDefaultTextSize, opening, output); return; } if ("scale".equalsIgnoreCase(tag)) { Attr = mAttributes.get("factor"); if (Attr != null && !Attr.isEmpty()) { float factor = parseFloat(Attr); if (factor > 0) ProcessRelativeSizeTag(factor, opening, output); } return; ... } } 

要使用,我将Textview对象的文本大小设置为1.即1像素! 然后,我在variablesmDefaultTextSize设置所需的真实文本大小。 我在htmlTextView有所有Htmlfunction,它将TextView扩展为:

 public class htmlTextView extends AppCompatTextView { static Typeface mLogo; static Typeface mGAMZ; static Typeface mBrush; static Typeface mStandard; int GS_PAINTFLAGS = FILTER_BITMAP_FLAG | ANTI_ALIAS_FLAG | SUBPIXEL_TEXT_FLAG | HINTING_ON; static float mDefaultTextSize; static Typeface mDefaultTypeface; etc 

}

其中包括公共方法

 public void setDefaultTextMetrics(String face, float defaultTextSize) { mDefaultTypeface = mStandard; if (face != null) { if ("gamz".equalsIgnoreCase(face)) { mDefaultTypeface = mGAMZ; } else { if ("brush".equalsIgnoreCase(face)) { mDefaultTypeface = mBrush; } } } setTypeface(mDefaultTypeface); setTextSize(1); mDefaultTextSize = defaultTextSize; } 

一个简单的((htmlTextView)tv).setDefaultTextMetrics(null, 30); call将my htmlTextView设置为默认使用我的标准字体,文本大小为30。

然后当我给它这个例子在fromHtml中使用时:

   qwertQWERT 

qwertQWERT

qwertQWERT

qwertQWERT

]]>

我的自定义标签只是让我突出显示文本的背景。 请参阅附图,使用标记显示一个结果, TextView文本大小设置为1, 标记调用RelevantSizeSpan的因子为30,其中一个结果为:

   qwertQWERT 

qwertQWERT

qwertQWERT

qwertQWERT

]]>

不使用标签,而是将TextView文本大小设置为30。 在第一种情况下,额外的新线仍然存在,但它只有1像素高!

NB ...标签没有实际意义。 他们只是遗留在其他测试的人工制品上。

结果:以下两个示例在段落之间有2个换行符,但在左侧的一个换行符中,其中一行只有1个像素高。 我将把它留给读者来弄清楚如何将它减少到零,但不要使用0的文本大小