web-dev-qa-db-ja.com

Androidテキストビューに<ul> <li>を表示

それにulとliが入ったStringがあります。そして、私はそれらをtextviewのHTMLフォーマットで表示しようとしています。
textView.setText(Html.fromHtml(myHtmlText));
しかし、textviewはプレーンテキストを表示します。 ulおよびliタグをテキストビューでフォーマットするにはどうすればよいですか?

27
aman.nepid

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()));
46
Pavel

文字列リソースでサポートされるタグ

静的文字列リソース内のタグは、隠しクラスである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 を参照してください

9
K_Anas

TextViewでサポートされるHTMLタグ 両方ulおよびliタグは Android.text.Html クラスではサポートされていません。

解決策:WebView を使用して、または TagHandler を使用して、これらのタグを表示できます

詳細については、この投稿を参照してください:

HTMLリストタグが機能しないAndroidテキストビュー。何ができる?

6

以下の回答によると、すべてのHTMLタグをここで使用できるわけではありません。

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

しかし、確かに、Android TextViewで箇条書きを表示する方法があります。<li>タグを&#149;(箇条書きのHTMLコード)に置き換えることができます。

他のリストアイコンを試してみたい場合は、このリンクの表から優先的に使用してください。

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

4
Taner

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以降ではTagHandlerは不要です。Android.text.Htmlliをサポートし、 ulタグ。

1
jameswoo

私の場合、私のデータは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;
}
0
Shane

私の場合、(JSON応答としてバックエンドから)文字列のリストを取得し、TextViewに対してのみこのアプローチを使用してHTMLを手動でレンダリングします。

Kotlin内

_// 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_と呼ぶことができるようにファイル名を変更すると便利です。詳細は 詳細はこちら

PS:これを自由に編集してください

0
mochadwi