Android 删除Html.fromHtml()之后的额外换行符

Android 删除Html.fromHtml()之后的额外换行符,android,html,line-breaks,spanned,Android,Html,Line Breaks,Spanned,我正在尝试将html放入文本视图中。一切都很完美,这是我的代码 String htmlTxt = "<p>Hellllo</p>"; // the html is form an API Spanned html = Html.fromHtml(htmlTxt); myTextView.setText(html); String htmlText=“helllo”;//html是一种API形式 跨距html=html.fromHtml(htmlTxt); 设置文本(ht

我正在尝试将html放入文本视图中。一切都很完美,这是我的代码

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

”;//html是一种API形式 跨距html=html.fromHtml(htmlTxt); 设置文本(html);
这将使用正确的html设置我的文本视图。但我的问题是,html中有一个标记,进入TextView的结果文本的末尾有一个“\n”,因此它会将我的TextView的高度推高

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


有人知道从“已跨越”变量中删除结束换行符的解决方案吗?

可跨越是一个字符序列,您可以对其进行操作

这项工作:

myTextView.setText(noTrailingwhiteLines(html)); private CharSequence noTrailingwhiteLines(CharSequence text) { while (text.charAt(text.length() - 1) == '\n') { text = text.subSequence(0, text.length() - 1); } return text; } setText(noTrailingwhiteLines(html)); 专用字符序列noTrailingwhiteLines(字符序列文本){ 而(text.charAt(text.length()-1)='\n'){ text=text.subSequence(0,text.length()-1); } 返回文本; }
回答得好,克里斯汀。今天下午,我编写了一个类似的函数来删除字符序列中的尾随空格:

/** 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);
}

你可以用这句话。。。完全有效;)

我知道你的问题已经解决了,但也许有人会觉得这很有用

try{
        string= replceLast(string,"<p dir=\"ltr\">", "");
        string=replceLast(string,"</p>", "");
}catch (Exception e) {}
您可以尝试以下方法:

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

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

您可以使用实际的HTML换行符(

)吗?您可以将换行符放在文本之前,后面什么也不放,因此它是:
hellllooooo,这将使它在文本上方有一个换行符,但在文本下方没有任何换行符。@Ben,html返回值来自API,我无法控制它。也许使用它可以工作。还有很多其他的函数可以帮助你解决这个问题…我今天一直在努力解决这个问题。下面的答案和我自己写的一样好用。问题在于

标记不仅在末尾,而且在文本的其他地方。唯一的方法是将其转换为字符串并进行.replace(…)操作,但随后会丢失所有格式设置。也请检查这一点,非常简单的方法可以工作;)这对于
SpannableString
s来说效率很低,因为
subSequence()
创建了一个全新的
SpannableString
对象。被接受的答案要好得多。当你在程序员的时间、代码可读性和程序效率之间做出权衡时,这取决于哪个版本更好。我认为程序效率是最不相关的参数,除非您的代码在百万设备上每秒执行一千次。这是IMO A <代码>做的地方,而比<<代码>更可读,而:<代码> do {-i;},(i >=0 & &字符空白(C.CARAT(i)))< /代码>(显然,将其拆分为多行——StackOverflow不允许我在注释中这样做)我在使用CharSequence时遇到问题,因此必须将其转换为跨距,例如temp=(跨距)temp.subSequence(0,temp.length()-2);//具有“\n\n”在末尾,您不是通过将跨距对象转换为字符串而丢失了跨距吗?@Saket您不是返回修剪过的字符串,而是创建了具有修剪过的字符串长度的跨距字符序列的子序列。您没有丢失跨距。但是,如果有前导空格,这将不起作用,对吗?trim()删除前导空格和尾随空格
Spanned htmlDescription = Html.fromHtml(textWithHtml);
String descriptionWithOutExtraSpace = new String(htmlDescription.toString()).trim();

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