带有Html.fromHtml格式问题的TextView

时间:2015-09-25 14:15:22

标签: android html textview

我有一个TextView会收到一些html格式的文字,如:

<p class="p1"><span class="s1"><strong>Name</strong>&nbsp; Mr. A</span></p>
<p class="p1"><span class="s1"><strong>Place:</strong>&nbsp; Somewhere over the rainbow...</span></p>

我正在使用此代码:

CharSequence sequence = Html.fromHtml(html);
SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence);
text.setText(strBuilder);

结束于:

  

姓名:A \ n \ nPlace先生:在彩虹的某个地方\ n \ n

问题,我不想“\ n \ n”我只想要一个“\ n”,所以我做到了这一点:

sequence = sequence.toString().replaceAll("\n\n", "\n");

结束于:

  

姓名:A \ nPlace先生:在彩虹的某个地方\ n

并删除最后一个“\ n”:

try {
    int i = sequence.toString().lastIndexOf("\n");
    sequence = new StringBuilder(sequence).replace(i, i + 1, "").toString();
} catch (Exception e) {
    e.printStackTrace();
}

结束于:

  

姓名:A \ nPlace先生:在彩虹的某个地方

就像我想要的那样完美,但现在所有的HTML格式都消失了。 我该如何解决这种情况呢? 感谢。

编辑1:
用户 Bas van Stein 建议我删除StringBuilder,但我没有发布所有代码。所以,我使用StringBuilder,因为如果文本包含URL,我会这样做(完整代码):

CharSequence sequence = Html.fromHtml(html);
sequence = sequence.toString().replaceAll("\n\n", "\n");
try {
    int i = sequence.toString().lastIndexOf("\n");
    sequence = new StringBuilder(sequence).replace(i, i + 1, "").toString();
} catch (Exception e) {
    e.printStackTrace();
}
SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence);
URLSpan[] urls = strBuilder.getSpans(0, sequence.length(), URLSpan.class);
for (URLSpan span : urls) {
    makeLinkClickable(context, strBuilder, span, color);
}
text.setText(strBuilder);

makeLinkClickable方法:

private void makeLinkClickable(final Context context, SpannableStringBuilder strBuilder, final URLSpan span, int color) {
    int start = strBuilder.getSpanStart(span);
    int end = strBuilder.getSpanEnd(span);
    int flags = strBuilder.getSpanFlags(span);
    strBuilder.setSpan(new ClickableSpan() {
        @Override
        public void onClick(View widget) {
            ...
        }
    }, start, end, flags);
    strBuilder.setSpan(new ForegroundColorSpan(color), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
    strBuilder.removeSpan(span);
}

编辑2:
好的,所以我弄清楚导致格式信息丢失的原因是,我忽略了从Spanned转换的Html.fromHtml(html)文本。我想我必须删除“\ n \ n”和最后一个“\ n”,而不会丢失所有Spanned样式的Span对象等。继续工作...... < / p>

1 个答案:

答案 0 :(得分:3)

问题是您使用的是StringBuilder,根本不需要。您可以将文本设置为html,如下所示:

myTextView.setText(Html.fromHtml("<h2>Title</h2><br><p>Description here</p>"));

所以只需删除字符串构建器就可以得到你想要的东西。

编辑好的,在您更新了问题之后,我还有一个建议: 当您将 替换为之前将其传递给Html.fromHtml()时会发生什么。 可能会工作..