在android textview中显示<ul> <li> </li> </ul>

时间:2012-06-26 18:45:23

标签: android html formatting textview

我有一个带有ul和li的字符串。我试图在textview中以HTML格式显示它们。
textView.setText(Html.fromHtml(myHtmlText));
但是textview显示了纯文本。如何在textview中格式化ul和li标签?

7 个答案:

答案 0 :(得分:45)

您可以使用Html.TagHandler。

在你的情况下,它将是这样的:

public class UlTagHandler implements Html.TagHandler{
    @Override
    public void handleTag(boolean opening, String tag, Editable output,
                          XMLReader xmlReader) {
            if(tag.equals("ul") && !opening) output.append("\n");
            if(tag.equals("li") && opening) output.append("\n\t•");
    }
}

textView.setText(Html.fromHtml(myHtmlText, null, new UlTagHandler()));

答案 1 :(得分:9)

字符串资源中支持的标记

静态字符串资源中的标记由android.content.res.StringBlock解析,这是一个隐藏的类。我查看了课程并确定了支持哪些标签:

<a> (supports attributes "href")
<annotation>
<b>
<big>
<font> (supports attributes "height", "size", "fgcolor" and "bicolor", as integers)
<i>
<li>
<marquee>
<small>
<strike>
<sub>
<sup>
<tt>
<u>

Html.fromHtml()支持的标签

出于某种原因,Html.fromHtml()处理一组不同于静态文本支持的标记。这是一个标签列表(从Html.java的源代码中收集):

<a> (supports attribute "href")
<b>
<big>
<blockquote>
<br>
<cite>
<dfn>
<div>
<em>
<font> (supports attributes "color" and "face")
<i>
<img> (supports attribute "src". Note: you have to include an ImageGetter to handle retrieving a Drawable for this tag)
<p>
<small>
<strong>
<sub>
<sup>
<tt>
<u>

有关详细信息,请参阅此link

答案 2 :(得分:6)

请参阅HTML Tags Supported By TextView android.text.Html类不支持 ul li 标记。

解决方案:您可以使用WebViewTagHandler

显示这些代码

获取更多帮助,请参阅此帖:

Html List tag not working in android textview. what can i do?

答案 3 :(得分:4)

根据以下答案,您不能在此处使用每个HTML标记;

https://stackoverflow.com/a/3150456/2275962

但是,当然,有一种方法可以在Android TextView中显示项目符号。您可以将<li>代码替换为&#149;(这是项目符号的HTML代码)。

如果您想尝试其他列表图标,请使用表中的首选图标链接;

http://www.ascii-code.com/

答案 4 :(得分:1)

一种使事情在API级别M(23)及更低级别上正常工作的简单方法 在您的HTML字符串中,您可以使用以下内容:

private fun String.formattedHtml(): String {
    // Work around for API Versions lower than N, Html.fromHtml does not render list items correctly
    return if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
        this.replace("<ul>", "")
            .replace("</ul>", "")
            .replace("<li>", "<p>• ")
            .replace("</li>", "</p>")
    } else {
        this
    }
}

然后,您可以使用:

Html.fromHtml("<ul><li> test </li></ul>".formattedHtml())

https://stackoverflow.com/a/40524835所述,对于API N及更高版本,不需要TagHandlerandroid.text.Html支持liul标签。

答案 5 :(得分:0)

我的情况是我的数据来自API调用。我仍然需要输出以匹配我的应用程序的格式,所以我将HTML字符串包装在格式化标签中以显示在我的WebView中:

public static String formatHtmlString(String stringIn) {

    String format = "<html>"
            + "  <head>"
            + "    <style type='text/css'>"
            + "      body { "
            + "           font-family: \"HelveticaNeue-Light\", \"Helvetica Neue Light\"; "
            + "           font-size:14px;" + "           color:#000;"
            + "      }" + "      b { " + "           font-size:14px;"
            + "       }" + "      i { " + "           font-size:10px;"
            + "           color:#333333;" + "           opacity:0.75;"
            + "       }" + "    </style>" + "  </head>" + "  <body>"
            + stringIn + "</body>" + "</html>";

    return format;
}

答案 6 :(得分:0)

在我的情况下,我得到一个String列表(从后端作为JSON响应),然后仅使用TextView的这种方法来手动呈现HTML:

在科特林

// ViewUtils.kt
@file:JvmName("ViewUtils")

package com.company

private fun List<String>.joinToBulletList(): String =
        joinToString(prefix = "<ul>", postfix = "</ul>", separator = "\n") {
            "<li> $it</li>"
        }

fun TextView.renderToHtmlWithBulletList(contents: List<String>) {
    val content = contents.joinToBulletList()

    val html: Spannable = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        Html.fromHtml(content, Html.FROM_HTML_MODE_COMPACT, null, null) as Spannable
    } else {
        Html.fromHtml(content, null, null) as Spannable
    }

    text = html
}

// AnyActivity.kt
val contents = listOf("desc 1", "desc 2", "desc 3")
textViewFromXml.renderToHtmlWithBulletList(contents)

在Java中

// AnyActivity.java
List<String> contents = new String["desc 1", "desc 2", "desc 3"];
ViewUtils.renderToHtmlWithBulletList(textViewFromXml, contents)

请注意,@file:JvmName("ViewUtils")更改文件名非常有用,因此Java代码可以将其命名为ViewUtils.java而不是ViewUtilsKt.java。参见here for more detail

P.S:请随时进行修改