109 votes

La balise Html List ne fonctionne pas dans le textview Android. Que dois-je faire ?

La balise Html List ne fonctionne pas dans Android TextView. Voici le contenu de ma chaîne :

String str="A dressy take on classic gingham in a soft, textured weave of stripes that resembles twill.  Take a closer look at this one.<ul><li>Trim, tailored fit for a bespoke feel</li><li>Medium spread collar, one-button mitered barrel cuffs</li><li>Applied placket with genuine mother-of-pearl buttons</li><li>;Split back yoke, rear side pleats</li><li>Made in the U.S.A. of 100% imported cotton.</li></ul>";

Je l'ai chargé dans une vue de texte comme ceci :

textview.setText(Html.fromHtml(str));

La sortie ressemble à un paragraphe. Que puis-je faire ? Existe-t-il une solution ?

Edit :

webview.loadData(str,"text/html","utf-8");

1 votes

Devrait être text/html et non texl/html.

165voto

Cristian Points 92147

Comme vous pouvez le voir dans le Html code source de la classe , Html.fromHtml(String) ne prend pas en charge toutes les balises HTML. Dans ce cas précis, <ul> y <li> ne sont pas prises en charge.

À partir du code source, j'ai établi une liste des balises HTML autorisées :

  • br
  • p
  • div
  • em
  • b
  • strong
  • cite
  • dfn
  • i
  • big
  • small
  • font
  • blockquote
  • tt
  • monospace
  • a
  • u
  • sup
  • sub

Donc vous feriez mieux d'utiliser WebView et son loadDataWithBaseURL méthode. Essayez quelque chose comme ça :

String str="<html><body>A dressy take on classic gingham in a soft, textured weave of stripes that resembles twill.  Take a closer look at this one.<ul><li>Trim, tailored fit for a bespoke feel</li><li>Medium spread collar, one-button mitered barrel cuffs</li><li>Applied placket with genuine mother-of-pearl buttons</li><li>;Split back yoke, rear side pleats</li><li>Made in the U.S.A. of 100% imported cotton.</li></ul></body></html>";
webView.loadDataWithBaseURL(null, str, "text/html", "utf-8", null);

0 votes

Alors que puis-je faire pour y remédier ?

2 votes

Il est très important de noter que certains attributs de ces balises "autorisées" ne sont pas supportés non plus :=(

0 votes

Ce qu'on doit faire pour ça ? tu veux dire qu'il faut juste omettre ça ?

140voto

J'ai le même problème, ce que j'ai fait, c'est remplacer la valeur par défaut de l'option TagHandler . Celui-ci a fonctionné pour moi.

public class MyTagHandler implements TagHandler {

    boolean first = true;
    String parent = null;
    int index = 1;
    @Override
    public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {

        if (tag.equals("ul")) {
            parent = "ul";
        } else if (tag.equals("ol")) {
            parent = "ol";
        }

        if (tag.equals("li")) {
            if (parent.equals("ul")) {
                if (first) {
                    output.append("\n\t•");
                    first = false;
                } else {
                    first = true;
                }
            } else{
                if (first) {
                    output.append("\n\t"+index+". ");
                    first = false;
                    index++;
                } else {
                    first = true;
                }
            }   
        }
    }
}

et pour l'affichage du texte...

myTextView.setText(Html.fromHtml("<ul><li>I am an Android developer</li><li>Another Item</li></ul>", null, new MyTagHandler()));

[Edit]

Kuitsi a également posté une bonne bibliothèque qui fait la même chose, je l'ai obtenu de ce lien SO .

0 votes

Nous avons fini par utiliser cette approche. Toutes les balises HTML non prises en charge, nous les codons nous-mêmes en texte. Pour l'instant, ce ne sont que des ol et des ul, mais nous avons ajouté des piles pour gérer l'imbrication des listes et le stockage des index lors de l'imbrication des ol. De plus, vous pouvez utiliser le paramètre booléen d'ouverture en remplacement de first.

6 votes

@Aman Gautam très impressionnant merci pour cela ! Avez-vous une idée de comment tabuler le texte lorsqu'il s'étend sur plus d'une ligne ? Avec ce code, après la deuxième ligne, le texte est aligné avec le numéro plutôt que d'être tabulé pour garder le numéro séparé. J'ai essayé plusieurs choses mais je n'ai pas réussi à trouver la solution.

0 votes

Même chose ici, les sauts de ligne dans une liste provoquent une trobule avec cette approche.

68voto

Kuitsi Points 688

L'exemple complet de projet se trouve à l'adresse suivante https://bitbucket.org/Kuitsi/Android-textview-html-list .
Un exemple de photo est disponible à l'adresse suivante https://kuitsi.bitbucket.io/stackoverflow3150400_screen.png

Cette solution est la plus proche de réponse de masha . Un peu de code est également pris de la classe interne android.text.Html.HtmlToSpannedConverter . Il supporte les listes ordonnées et non ordonnées imbriquées, mais les textes trop longs dans les listes ordonnées sont toujours alignés sur le numéro de l'élément plutôt que sur le texte. Les listes mixtes (ol et ul) nécessitent également un peu de travail. L'exemple de projet contient l'implémentation de Html.TagHandler qui est transmis à Html.fromHtml(String, ImageGetter, TagHandler) .

Edit : Pour un support plus large des balises HTML, https://github.com/NightWhistler/HtmlSpanner peut également valoir la peine d'être essayé.

0 votes

Jusqu'à présent, la meilleure solution. Merci.

0 votes

Il n'y a pas de suivi des problèmes dans le repo BitBucket, donc je poste ici : vous devez ajouter des contrôles. ici y ici para output.length() > 0 dans le cas de if (output.length() > 0 && output.charAt(output.length() - 1) != '\n')

2 votes

Pour éviter que d'autres personnes ne perdent 2 heures à faire cela, NightWhistler HtmlSpanner supprime tous les caractères accentués pour une raison inconnue.

25voto

Truong Nguyen Points 319

Un petit correctif au code Aman Guatam. La fonction ci-dessus a un problème de rendu du caractère de nouvelle ligne. Par exemple : si avant <li> est une balise <p> 2 caractères de nouvelle ligne sont rendus. Voici le code mis à jour :

import org.xml.sax.XMLReader;

import android.text.Editable;
import android.text.Html.TagHandler;

public class ListTagHandler implements TagHandler {
    boolean first = true;

    @Override
    public void handleTag(boolean opening, String tag, Editable output, XMLReader xmlReader) {

        // TODO Auto-generated method stub
        if (tag.equals("li")) {
            char lastChar = 0;
            if (output.length() > 0)
                lastChar = output.charAt(output.length() - 1);
            if (first) {
                if (lastChar == '\n')
                    output.append("\t•  ");
                else
                    output.append("\n\t•  ");
                first = false;
            } else {
                first = true;
            }
        }
    }
}

0 votes

Qu'en est-il de la liste ordonnée ?

8voto

Naku Points 59

Si vous n'avez besoin que de formater une liste, restez simple et copiez/collez un caractère unicode dans votre TextView pour obtenir le même résultat.

- Caractère Unicode "BULLET" (U+2022)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X