853

我有简单的HTML

<h2>Title</h2><br>
<p>description here</p>

我想在TextView. 这该怎么做?

4

28 回答 28

1513

您需要Html.fromHtml()在 XML 字符串中使用 HTML。在您的布局 XML 中简单地引用带有 HTML 的字符串是行不通的。

这是你在 Java 中应该做的

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>"));
}

在 Kotlin 中:

textView.text = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
    Html.fromHtml(html, Html.FROM_HTML_MODE_COMPACT)
} else {
    Html.fromHtml(html)
}
于 2010-01-22T09:20:22.643 回答
87

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));
 }
于 2017-01-11T07:40:04.043 回答
72

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

也很不错!!

<resource>
    <string name="your_string">This is an <u>underline</u> text demo for TextView.</string>
</resources>

它仅适用于少数标签。

于 2012-05-06T06:17:34.170 回答
46

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

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

xml:

<com.package.HTMLTextView
android:text="@string/about_item_1"/>
于 2014-12-13T19:50:58.447 回答
33

如果您尝试从字符串资源 id 显示 HTML,则格式可能不会显示在屏幕上。如果您遇到这种情况,请尝试改用 CDATA 标记:

strings.xml:
<string name="sample_string"><![CDATA[<h2>Title</h2><br><p>Description here</p>]]></string>

...

MainActivity.java:
text.setText(Html.fromHtml(getString(R.string.sample_string));

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

于 2016-07-08T17:22:43.650 回答
25

下面的代码给了我最好的结果。

TextView myTextview = (TextView) findViewById(R.id.my_text_view);
htmltext = <your html (markup) character>;
Spanned sp = Html.fromHtml(htmltext);
myTextview.setText(sp);
于 2013-10-21T05:31:04.443 回答
21

我知道这个问题很老了。这里的其他答案建议Html.fromHtml()方法。我建议你HtmlCompat.fromHtml()androidx.core.text.HtmlCompat包中使用。因为这是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);

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

于 2019-01-04T06:52:54.967 回答
14
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());
于 2014-12-02T13:15:45.237 回答
12

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

String htmlText = ...;
webview.loadData(htmlText , "text/html; charset=UTF-8", null);

这也不限制您使用几个 html 标签。

于 2015-06-26T13:51:38.510 回答
12

在 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));

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

输出:

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

于 2016-08-19T07:15:23.923 回答
10

值得一提的是,方法Html.fromHtml(String source)自 API 级别 24 起已弃用。如果这是您的目标 API,则应改用Html.fromHtml(String source, int flags)

于 2016-06-22T05:31:34.477 回答
9

创建Kotlin扩展以从String转换html -

fun String?.toHtml(): Spanned? {
    if (this.isNullOrEmpty()) return null
    return HtmlCompat.fromHtml(this, HtmlCompat.FROM_HTML_MODE_COMPACT)
}
于 2020-02-22T12:15:48.550 回答
6

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

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

(new HtmlSpanner()).fromHtml()

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

于 2015-03-12T08:15:43.507 回答
5

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

于 2013-02-23T10:54:52.320 回答
5

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

因此,您可能希望使用兼容性库来标准化和支持跨 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);
于 2017-03-15T13:57:42.867 回答
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);
    }

使用起来HtmlCompat.fromHtmlHtml.fromHtml代码少-只有一行代码更好,并且是推荐的使用方式。

于 2019-05-30T08:55:51.700 回答
4

我已经使用网络视图实现了这一点。在我的情况下,我必须从 URL 加载图像以及文本视图中的文本,这对我有用。

WebView myWebView =new WebView(_context);
        String html = childText;
        String mime = "text/html";
        String encoding = "utf-8";
        myWebView.getSettings().setJavaScriptEnabled(true);
        myWebView.loadDataWithBaseURL(null, html, mime, encoding, null);
于 2015-12-04T11:18:34.520 回答
4
String value = html value ....
mTextView.setText(Html.fromHtml(value),TextView.BufferType.SPANNABLE)
于 2016-01-27T10:07:20.390 回答
4

制作一个全局方法,如:

public static Spanned stripHtml(String html) {
            if (!TextUtils.isEmpty(html)) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
                    return Html.fromHtml(html, Html.FROM_HTML_MODE_COMPACT);
                } else {
                    return Html.fromHtml(html);
                }
            }
            return null;
        }

您也可以在 Activity/Fragment 中使用它,例如:

text_view.setText(stripHtml(htmlText));
于 2018-09-20T16:39:24.110 回答
2

每当您编写自定义文本视图时,基本的 HTML 设置文本功能都会从某些设备中消失。

所以我们需要做以下额外的步骤使工作正常

public class CustomTextView extends TextView {

    public CustomTextView(..) {
        // other instructions
        setText(Html.fromHtml(getText().toString()));
    }
}
于 2018-08-17T06:10:49.413 回答
2

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

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>")
于 2021-04-16T08:56:23.487 回答
1
public class HtmlTextView extends AppCompatTextView {

public HtmlTextView(Context context) {
    super(context);
    init();
}

private void init(){
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        setText(Html.fromHtml(getText().toString(), Html.FROM_HTML_MODE_COMPACT));
    } else {
        setText(Html.fromHtml(getText().toString()));
    }
 }
}

更新上面的答案

于 2019-06-28T13:04:45.020 回答
1

使用以下代码获取解决方案:

textView.setText(fromHtml("<Your Html Text>"))

效用法

public static Spanned fromHtml(String text)
{
    Spanned result;
    if (Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
        result = Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY);
    } else {
        result = Html.fromHtml(text);
    }
    return result;
}
于 2019-12-15T17:30:32.363 回答
1

只需使用:

String variable="StackOverflow";
textView.setText(Html.fromHtml("<b>Hello : </b>"+ variable));
于 2020-02-12T06:47:31.840 回答
1

人们已经建议了 TextView、WebView 和各种解决方案的子类。我想知道为什么没有人提到一个简单的绑定适配器

@BindingAdapter(value = ["htmlText"])
fun TextView.setHtmlText(string: String?) {
    text = HtmlCompat.fromHtml(string?:"", HtmlCompat.FROM_HTML_MODE_COMPACT)
}

所以你的 TextView xml 看起来像

<TextView
   ...
   htmlText="<p>Your <b>HTML</b> text</p>"
   ... />
于 2021-09-14T06:17:33.507 回答
0

我可以建议一个有点hacky但仍然是天才的解决方案!我从这篇文章中得到了这个想法,并将其改编为 Android。基本上,您使用 aWebView并在可编辑的 div 标记中插入要显示和编辑的 HTML。这样,当用户点击WebView键盘时,就会出现并允许编辑。他们只需添加一些 JavaScript 即可取回已编辑的 HTML,瞧!

这是代码:

public class HtmlTextEditor extends WebView {

    class JsObject {
        // This field always keeps the latest edited text
        public String text;
        @JavascriptInterface
        public void textDidChange(String newText) {
            text = newText.replace("\n", "");
        }
    }

    private JsObject mJsObject;

    public HtmlTextEditor(Context context, AttributeSet attrs) {
        super(context, attrs);

        getSettings().setJavaScriptEnabled(true);
        mJsObject = new JsObject();
        addJavascriptInterface(mJsObject, "injectedObject");
        setWebViewClient(new WebViewClient(){
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                loadUrl(
                        "javascript:(function() { " +
                            "    var editor = document.getElementById(\"editor\");" +
                            "    editor.addEventListener(\"input\", function() {" +
                            "        injectedObject.textDidChange(editor.innerHTML);" +
                            "    }, false)" +
                            "})()");
            }
        });
    }

    public void setText(String text) {
        if (text == null) { text = ""; }

        String editableHtmlTemplate = "<!DOCTYPE html>" + "<html>" + "<head>" + "<meta name=\"viewport\" content=\"initial-scale=1.0\" />" + "</head>" + "<body>" + "<div id=\"editor\" contenteditable=\"true\">___REPLACE___</div>" + "</body>" + "</html>";
        String editableHtml = editableHtmlTemplate.replace("___REPLACE___", text);
        loadData(editableHtml, "text/html; charset=utf-8", "UTF-8");
        // Init the text field in case it's read without editing the text before
        mJsObject.text = text;
    }

    public String getText() {
        return mJsObject.text;
    }
}

这是作为 Gist 的组件

注意:我不需要原始解决方案中的高度更改回调,因此这里缺少,但如果需要,您可以轻松添加它。

于 2018-09-26T20:49:27.493 回答
0

您可以像这样使用简单的 Kotlin 扩展功能:

fun TextView.setHtmlText(source: String) {
    this.text = HtmlCompat.fromHtml(source, HtmlCompat.FROM_HTML_MODE_LEGACY)
}

和用法:

textViewMessage.setHtmlText("Message: <b>Hello World</b>")
于 2020-02-06T09:13:57.120 回答
-1

TextView您可以使用HtmlDslGithub 上的库为 Android 构建有效的 HTML : https ://github.com/jaredrummler/HtmlDsl 。

该库提供语法糖,通过仅支持由 Android 呈现的元素和属性,使代码更易于理解且不易出错。

创建一些 HTML 的示例:

textView.setHtml {
    h3("Android Versions:")
    ul {
        li {
            a(href = "https://developer.android.com/about/versions/12/get") {
                +"Android 12 Beta"
            }
        }
        li("Android 11")
        li("Android 10")
        li("Pie")
        li("Oreo")
        li("Nougat")
        li("Marshmallow")
        li("Lollipop")
        // ...
    }

    small {
        sub {
            +"by "
            a {
                href = "https://github.com/jaredrummler"
                text = "Jared Rummler"
            }
        }
    }
}

Android 支持的 HTML 元素TextView

<a href="...">
<b>
<big>
<blockquote>
<br>
<cite>
<dfn>
<div align="...">
<em>
<font color="..." face="...">
<h1>
<h2>
<h3>
<h4>
<h5>
<h6>
<i>
<img src="...">
<p>
<small>
<strike>
<strong>
<sub>
<sup>
<tt>
<u>
<ul>
<li>
于 2021-09-25T07:59:10.697 回答