将HTML格式的字符串插入到TextView和EditText中

3

大家好,

我有一个数据库,用于存储带有HTML标记的文本,以保留EditText中的格式信息。我使用HTML.toHtml(EditText.getText)创建此字符串。我注意到这个方法会将输入的Spanned Text用<p>和</p>包裹起来。问题在于,当我使用HTML.fromHtml(HTMLFormattedString)方法并使用TextView或EditText的setText方法时,我的实际文本末尾会多出两行空白,这是由于段落标签在HTML中的工作方式所致。

我的问题是是否有任何方法可以使textView或EditText缩小以不显示额外的空白行?最简单的方法是什么?我已经尝试过只删除最后一个<p>和</p>,但这只适用于用户没有使用三个或更多换行键的情况。

2个回答

3
我最终搜索了被跨度文本末尾的空格并将其删除。这解决了由于<p> </p>而产生的额外空格问题,比覆盖所提到的类以实现相同结果更节省时间。
public SpannableStringBuilder trimTrailingWhitespace(
        SpannableStringBuilder spannableString) {

    if (spannableString == null)
        return new SpannableStringBuilder("");

    int i = spannableString.length();

    // loop back to the first non-whitespace character
    while (--i >= 0 && Character.isWhitespace(spannableString.charAt(i))) {
    }

    return new SpannableStringBuilder(spannableString.subSequence(0, i + 1));
}

2
这只是一个迂回的方法。我有同样的问题,并提供两个选项:
1)正如你所说,段落标签按照你怀疑的方式工作。它会将两个“\n”值附加到每个<p>标签的末尾。因此,您可以将html转换为字符串并删除通常是两个“\n”的最后两个字符。
或者
2)您必须进入Html类本身。也就是说,您必须重写HTML类并查找handleP(SpannableStringBuilder text),稍微更改其核心逻辑。
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");


    }
} 

正如您在此处所见,它在len!=0中附加了两个“\n”,这就是您需要进行更改的地方。

1
+1 鼓励查阅文档。你通常会在哪里查找呢?其实我比较懒,不想自己去查。 - Vinay W
1
Vinay,你可以在这里找到它 - http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.1_r1/android/text/Html.java#HtmlToSpannedConverter.handleP%28android.text.SpannableStringBuilder%29 - ControlAltDelete
问题在于你所引用的类是受保护的,因此你无法覆盖该方法。本质上,在那一点上,你正在重新创建一个自定义的HTML类。 - ControlAltDelete
是的,那就是我的意思。这很棘手。你必须使用tagsoup jar覆盖支持类,并将其添加到你的项目中。但那就是我做的方式。 - Andro Selva
你可以发布你所做的部分吗? - ControlAltDelete

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接