如何在TextView中显示HTML?

UMA*_*MAR 730 html android textview xml-parsing

我有简单的HTML:

<h2>Title</h2><br>
<p>description here</p>
Run Code Online (Sandbox Code Playgroud)

我想在其中显示HTML样式的文本TextView.这该怎么做?

Dav*_*und 1300

您需要使用Html.fromHtml()XML字符串中的HTML.简单地在布局XML中引用带有HTML的String将不起作用.

这是你应该做的:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    textView.setText(Html.fromHtml("<h2>Title</h2><br><p>Description here</p>", Html.FROM_HTML_MODE_COMPACT));
} else { 
    textView.setText(Html.fromHtml("<h2>Title</h2><br><p>Description here</p>"));
}
Run Code Online (Sandbox Code Playgroud)

  • @Martin我不会说*为了可读性*而是*为了穷举*.直接在代码中使用的IMO完全限定名称比短名称更不易读.但我同意你的意见,这样的答案应该提供包(在旁注),链接点在这里;) (14认同)
  • 那应该是`android.text.Html.fromHtml`.我知道大多数IDE会为你修复它,但为了便于阅读,知道软件包名称会更好. (12认同)
  • Kostadin,你可以把标签放在XML中,你只需要将它们包装在CDATA括号中. (10认同)
  • 根据定义,`h2`会在自身周围产生很多余量.而且`p`也有一些余地.如果你不想要这个差距,你可能想考虑使用其他的html元素. (7认同)
  • 对于那些希望它使用ol/ul/li标签的人,请查看此解决方案:http://stackoverflow.com/a/3150456/1369016 (3认同)
  • 此方法在API级别24中已弃用 (3认同)
  • 我可以将标签放在XML字符串中吗? (2认同)
  • 我们不能把<table> <tr> <td>放在这里吗? (2认同)
  • 可以在[此处]找到此方法支持的标记列表(http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html) (2认同)
  • 但这是否以适当的方式格式化文本? (2认同)

Sho*_*jan 70

的setText(Html.fromHtml(bodyData))弃用的API 24.现在你必须这样做后:

 if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
      tvDocument.setText(Html.fromHtml(bodyData,Html.FROM_HTML_MODE_LEGACY));
 } else {
      tvDocument.setText(Html.fromHtml(bodyData));
 }
Run Code Online (Sandbox Code Playgroud)

  • 为什么在API 24+中使用FROM_HTML_MODE_LEGACY? (3认同)

Fel*_*ipe 62

看看这个:https://stackoverflow.com/a/8558249/450148

这也很不错!!

<resource>
    <string name="your_string">This is an <u>underline</u> text demo for TextView.</string>
</resources>
Run Code Online (Sandbox Code Playgroud)

它仅适用于少数标签.

  • @mente根据[源代码](http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/2.2_r1.1/android/text/Html.java) :<a>,<b>,<big>,<blockquote>,<br>,<cite>,<dfn> <div align ="...">,<em>,<font size =".. ."color ="..."face ="..."> <h1-6>,<i>,<img rel="nofollow noreferrer" src ="...">,<p>,<small> <strike>,< strong>,<sub>,<sup>,<tt>,<u>(来源:http://www.dzone.com/snippets/how-display-html-android) (23认同)
  • 此方法是否支持任何标记列表? (12认同)

use*_*412 40

如果您希望能够通过xml配置它而不需要在Java代码中进行任何修改,您可能会发现这个想法很有帮助.只需从构造函数中调用init并将文本设置为html即可

public class HTMLTextView extends TextView {
    ... constructors calling init...
    private void init(){
       setText(Html.fromHtml(getText().toString()));
    }    
}
Run Code Online (Sandbox Code Playgroud)

XML:

        <com.package.HTMLTextView
        android:text="@string/about_item_1"/>
Run Code Online (Sandbox Code Playgroud)

  • 什么是 '...'。请澄清 (2认同)

Raj*_*nan 23

以下代码为我提供了最佳结果.

TextView myTextview = (TextView) findViewById(R.id.my_text_view);
htmltext = <your html (markup) character>;
Spanned sp = Html.fromHtml(htmltext);
myTextview.setText(sp);
Run Code Online (Sandbox Code Playgroud)


Phi*_*o99 22

如果您尝试从字符串资源ID显示HTML,格式可能不会显示在屏幕上.如果发生这种情况,请尝试使用CDATA标签:

strings.xml:
<string name="sample_string"><![CDATA[<h2>Title</h2><br><p>Description here</p>]]></string>
Run Code Online (Sandbox Code Playgroud)

...

MainActivity.java:
text.setText(Html.fromHtml(getString(R.string.sample_string));
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅此帖子.


Sha*_*nth 17

我知道这个问题很老了。这里的其他答案建议Html.fromHtml()方法。我建议你使用HtmlCompat.fromHtml()from androidx.core.text.HtmlCompatpackage。因为这是Html类的向后兼容版本。

示例代码:

import androidx.core.text.HtmlCompat;
import android.text.Spanned;
import android.widget.TextView;

String htmlString = "<h1>Hello World!</h1>";

Spanned spanned = HtmlCompat.fromHtml(htmlString, HtmlCompat.FROM_HTML_MODE_COMPACT);

TextView tvOutput = (TextView) findViewById(R.id.text_view_id);

tvOutput.setText(spanned);
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以避免 Android API 版本检查,并且易于使用(单行解决方案)。

  • 我特意登录来给你的答案点赞。这是每个人都应该使用的。谢谢。 (3认同)
  • 正在寻找这样的东西。谢谢 :) (2认同)

小智 12

String value = "<html> <a href=\"http://example.com/\">example.com</a> </html>";
    SiteLink= (TextView) findViewById(R.id.textViewSite);
    SiteLink.setText(Html.fromHtml(value));
    SiteLink.setMovementMethod(LinkMovementMethod.getInstance());
Run Code Online (Sandbox Code Playgroud)


pro*_*m85 11

如果你只是想显示一些html文本并且不需要a TextView,那么请WebView使用它并使用如下:

String htmlText = ...;
webview.loadData(htmlText , "text/html; charset=UTF-8", null);
Run Code Online (Sandbox Code Playgroud)

这也不会限制你使用几个html标签.

  • webview非常慢 (3认同)
  • 虽然这是一种非常有用的方法来绕过受TextView支持的受限制的html标签集,但它的缺点是**使用`layout_height ="wrap_content"`它不能很好地工作**.您必须设置显式高度或match_parent. (2认同)

小智 11

对strings.xml文件中的字符串使用CData部分以获取html内容的实际显示到TextView下面的代码片段的最佳方法将为您提供合理的想法.

//in string.xml file
<string name="welcome_text"><![CDATA[<b>Welcome,</b> to the forthetyroprogrammers blog Logged in as:]]> %1$s.</string>

//and in Java code
String welcomStr=String.format(getString(R.string.welcome_text),username);
tvWelcomeUser.setText(Html.fromHtml(welcomStr));
Run Code Online (Sandbox Code Playgroud)

即使在使用String.format方法格式化文本之后,字符串文本中的CData部分也使html标记数据保持不变.因此,Html.fromHtml(str)工作正常,您将在欢迎消息中看到粗体文本.

输出:

欢迎来到您最喜爱的音乐应用商店.登录为:用户名


Teo*_*nke 10

值得一提的是,从API级别24开始,不推荐使用方法Html.fromHtml(String source).如果这是您的目标API,则应使用Html.fromHtml(String source,int flags).


Rom*_*man 9

创建Kotlin扩展以从字符串转换html -

fun String?.toHtml(): Spanned? {
    if (this.isNullOrEmpty()) return null
    return HtmlCompat.fromHtml(this, HtmlCompat.FROM_HTML_MODE_COMPACT)
}
Run Code Online (Sandbox Code Playgroud)


小智 6

我还想建议以下项目:https://github.com/NightWhistler/HtmlSpanner

用法几乎与默认的android转换器相同:

(new HtmlSpanner()).fromHtml()
Run Code Online (Sandbox Code Playgroud)

在我已经开始自己实现html到spannable转换器之后找到它,因为标准的Html.fromHtml没有提供足够的渲染控制灵活性,甚至没有可能使用来自ttf的自定义字体


San*_*eek 6

只需使用 在此输入图像描述

checkBoxTextView.text =
        Html.fromHtml("<p><font color=#666666>I agree to</font><font color=#0173B7>  <b><u>Terms & Conditions</u></b></font><font color=#666666> and the <u></font><b><font color=#0173B7>Privacy Policy</font></u></b></font></p>")
Run Code Online (Sandbox Code Playgroud)


jav*_*dev 5

使用简单Html.fromHtml("html string").这会奏效.如果字符串有标签,<h1>则会出现空格.但我们无法消除这些空间.如果您仍想删除空格,则可以删除字符串中的标记,然后将字符串传递给方法Html.fromHtml("html string");.通常这些字符串来自服务器(动态)但不经常,如果最好将字符串传递给方法,而不是尝试从字符串中删除标记.


Pau*_*sma 5

已经通过各种答案建议使用此处建议的Html框架类,但不幸的是,此类在不同版本的 Android 和各种未解决的错误中具有不同的行为,如问题2146371477823512875953 中所示

因此,您可能希望使用兼容性库来标准化和向后移植 Android 版本的 Html 类,其中包括更多的元素和样式回调:

Github 项目 HtmlCompat

虽然它类似于框架的 Html 类,但需要进行一些签名更改以允许更多回调。这是来自 GitHub 页面的示例:

Spanned fromHtml = HtmlCompat.fromHtml(context, source, 0);
// You may want to provide an ImageGetter, TagHandler and SpanCallback:
//Spanned fromHtml = HtmlCompat.fromHtml(context, source, 0,
//        imageGetter, tagHandler, spanCallback);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setText(fromHtml);
Run Code Online (Sandbox Code Playgroud)


pan*_*ear 5

如果您androidx.在项目中使用 * 类,则应该使用HtmlCompat.fromHtml(text, flag).

该方法的来源是:

@NonNull
    public static Spanned fromHtml(@NonNull String source, @FromHtmlFlags int flags) {
        if (Build.VERSION.SDK_INT >= 24) {
            return Html.fromHtml(source, flags);
        }
        //noinspection deprecation
        return Html.fromHtml(source);
    }
Run Code Online (Sandbox Code Playgroud)

HtmlCompat.fromHtml使用它比使用它更好Html.fromHtml,因为代码更少——只有一行代码,并且推荐使用它。