【问题标题】:Remove extra line breaks after Html.fromHtml()在 Html.fromHtml() 之后删除多余的换行符
【发布时间】:2012-03-06 18:06:17
【问题描述】:

我正在尝试将 html 放入 TextView。一切正常,这是我的代码。

String htmlTxt = "<p>Hellllo</p>"; // the html is form an API
Spanned html = Html.fromHtml(htmlTxt);
myTextView.setText(html);

这会将我的 TextView 设置为正确的 html。但我的问题是,有一个

html 中的

标记,进入 TextView 的结果文本末尾有一个“\n”,因此它将我的 TextView 的高度推高了。

由于它是一个 Spanned 变量,我无法应用正则表达式替换来删除“\n”,如果我要将其转换为字符串,然后应用正则表达式,我将失去让 html 锚点正常工作的功能.

有谁知道从“Spanned”变量中删除结束换行符的任何解决方案?

【问题讨论】:

  • 你能用实际的 HTML 换行符 (&lt;br/&gt;) 代替吗?您可以在文本之前放置换行符,之后什么都没有,所以它是:
    Helllllllllooooo ,这将在文本上方给它一个换行符,但在它下面没有任何内容。
  • @Ben,html 返回来自 API,我无法控制它。
  • 也许使用TextUtils.getTrimmedLength() 会起作用。 TextUtils 中还有很多其他功能可以帮助您解决问题...
  • 我今天一直在和这个作斗争。当我自己写的时候,下面的答案很好用。问题是当 标签不仅出现在末尾,而且出现在文本的其他地方时。唯一的方法是转换为字符串并执行 .replace(...) 但随后您会丢失所有格式。
  • 也检查一下,非常简单的方法和工作;)stackoverflow.com/a/24553061/2626219

标签: android html line-breaks spanned


【解决方案1】:

很好的答案@Christine。今天下午我写了一个类似的函数来从 CharSequence 中删除尾随空格:

/** Trims trailing whitespace. Removes any of these characters:
 * 0009, HORIZONTAL TABULATION
 * 000A, LINE FEED
 * 000B, VERTICAL TABULATION
 * 000C, FORM FEED
 * 000D, CARRIAGE RETURN
 * 001C, FILE SEPARATOR
 * 001D, GROUP SEPARATOR
 * 001E, RECORD SEPARATOR
 * 001F, UNIT SEPARATOR
 * @return "" if source is null, otherwise string with all trailing whitespace removed
 */
public static CharSequence trimTrailingWhitespace(CharSequence source) {

    if(source == null)
        return "";

    int i = source.length();

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

    return source.subSequence(0, i+1);
}

【讨论】:

  • 这是 IMO do-whilewhile 更具可读性的地方:do { --i; } while (i &gt;= 0 &amp;&amp; Character.isWhitespace(cs.charAt(i)))(显然,将其拆分为多行——StackOverflow 不允许我这样做评论)
  • 我在使用 CharSequence 时遇到了问题,因此不得不将其转换为 Spanned,例如temp = (Spanned) temp.subSequence(0, temp.length() - 2); // 末尾有“\n\n”
【解决方案2】:

spannable 是一个 CharSequence,您可以对其进行操作。

这行得通:

myTextView.setText(noTrailingwhiteLines(html)); 私人 CharSequence noTrailingwhiteLines(CharSequence 文本){ 而 (text.charAt(text.length() - 1) == '\n') { text = text.subSequence(0, text.length() - 1); } 返回文本; }

【讨论】:

  • 这对SpannableStrings 来说效率很低,因为subSequence() 创建了一个全新的SpannableString 对象。接受的答案要好得多。
  • 当你在程序员的时间、代码的可读性和程序效率之间进行权衡时,要看具体情况哪个版本更好。我认为程序效率是最不相关的参数,除非您的代码在数百万台设备上每秒执行一千次。
【解决方案3】:

你可以试试这个:

Spanned htmlDescription = Html.fromHtml(textWithHtml);
String descriptionWithOutExtraSpace = new String(htmlDescription.toString()).trim();

textView.setText(htmlDescription.subSequence(0, descriptionWithOutExtraSpace.length()));

【讨论】:

  • 将 Spanned 对象转换为 String 不会丢失跨度吗?
  • @Saket 您没有返回修剪后的字符串,而是使用修剪后的字符串的长度创建跨区 charSequence 的子序列。您不会丢失跨度。
  • 如果有前导空格,这将不起作用,对吧? trim() 删除前导和尾随空格
【解决方案4】:

你可以使用这条线......完全有效;)

我知道您的问题已解决,但也许有人觉得这很有用。

try{
        string= replceLast(string,"<p dir=\"ltr\">", "");
        string=replceLast(string,"</p>", "");
}catch (Exception e) {}

这里是 replaceLast ...

public String replceLast(String yourString, String frist,String second)
{
    StringBuilder b = new StringBuilder(yourString);
    b.replace(yourString.lastIndexOf(frist), yourString.lastIndexOf(frist)+frist.length(),second );
    return b.toString();
}

【讨论】:

    猜你喜欢
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-22
    • 1970-01-01
    相关资源
    最近更新 更多