首页 文章

如何在TextView中显示HTML?

提问于
浏览
652

我有简单的 HTML

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

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

18 回答

  • 6
    String value = html value ....
    mTextView.setText(Html.fromHtml(value),TextView.BufferType.SPANNABLE)
    
  • 61

    如果你想通过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"/>
    
  • 5

    我已经使用Web视图实现了这一点 . 在我的情况下,我必须从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);
    
  • 21

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

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

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

  • 1161

    制作一个全局方法,如:

    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));
    
  • 11

    如果您尝试从字符串资源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));
    

    有关详细信息,请参阅post .

  • 37

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

    TextView myTextview = (TextView) findViewById(R.id.my_text_view);
    htmltext = <your html (markup) character>;
    Spanned sp = Html.fromHtml(htmltext);
    myTextview.setText(sp);
    
  • 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));
    

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

    Output:

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

  • 3

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

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

    (new HtmlSpanner()).fromHtml()
    

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

  • 4

    在api 24之后 setText(Html.fromHtml(bodyData))deprecated . 现在你必须这样做:

    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));
     }
    
  • 10

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

  • 18

    我可以建议一个有点hacky但仍然天才的解决方案!我从this article得到了这个想法,并将其改编为Android . 基本上,您使用 WebView 并在可编辑的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;
        }
    }
    

    并且here是作为要点的组件 .

    注意:我不需要原始解决方案中的高度更改回调,因此在此处缺少,但您可以根据需要轻松添加 .

  • 10

    您需要使用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>"));
    }
    
  • 64

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

  • 2

    已经通过各种答案建议使用这里建议的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);
    
  • 2
    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());
    
  • 2

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

    这也很不错!!

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

    它仅适用于少数标签 .

  • 0

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

    所以我们需要做以下的附加步骤make is work

    public class CustomTextView extends TextView {
    
        public CustomTextView(..) {
            // other instructions
            setText(Html.fromHtml(getText().toString()));
        }
    }
    

相关问题