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 texte comme celle-ci:
textview.setText(Html.fromHtml(str));
La sortie ressemble à un paragraphe. Que puis-je faire? Y a-t-il une solution pour cela?
Éditer:
webview.loadData(str,"text/html","utf-8");
Réponses:
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>
et<li>
ne sont pas pris en charge.À partir du code source, j'ai construit une liste de balises HTML autorisées:
br
p
div
em
b
strong
cite
dfn
i
big
small
font
blockquote
tt
monospace
a
u
sup
sub
Vous feriez donc mieux d'utiliser
WebView
et saloadDataWithBaseURL
méthode. Essayez quelque chose comme ceci:la source
J'ai le même problème, ce que j'ai fait est de remplacer le TagHandler par défaut . Celui-ci a fonctionné pour moi.
et pour afficher le texte ...
[Éditer]
Kuitsi a également publié une très bonne bibliothèque qui fait de même, obtenue à partir de ce lien SO .
la source
L'exemple de projet complet se trouve à l' adresse https://bitbucket.org/Kuitsi/android-textview-html-list .
Un exemple d'image est disponible sur https://kuitsi.bitbucket.io/stackoverflow3150400_screen.png
Cette solution est la plus proche de la réponse de Masha . Une partie du code est également tirée de la classe interne
android.text.Html.HtmlToSpannedConverter
. Il prend en charge 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 d'élément plutôt que sur le texte. Les listes mixtes (ol et ul) nécessitent également du travail. L'exemple de projet contient l'implémentation de Html.TagHandler qui est passé à Html.fromHtml (String, ImageGetter, TagHandler) .Edit: Pour une prise en charge plus large des balises HTML, https://github.com/NightWhistler/HtmlSpanner peut également valoir la peine d'être essayé.la source
output.length() > 0
comme àif (output.length() > 0 && output.charAt(output.length() - 1) != '\n')
Une petite correction au code Aman Guatam. La fonction ci-dessus a un problème de rendu du caractère de nouvelle ligne. Par exemple: si avant la
<li>
balise est une<p>
balise, 2 caractères de nouvelle ligne sont rendus. Voici le code mis à jour:la source
AVERTISSEMENT
à partir du 10 février 2016
android.text.Html
prend en chargeli
,ul
balise et utilise un élément de basenew BulletSpan()
, ce qui signifie que dans les dernières versions d'Android, leHtml.TagHandler
solutions publiées ici seront ignoréesassurez-vous que votre code gère ce changement au cas où vous attendez un BulletSpan avec un écart plus grand que la valeur par défaut, vous devrez avoir une sorte de solution qui effectue une recherche / remplacement des étendues
la source
N
et au-dessus.Solution différente utilisant LeadingMarginSpan. Gère les listes ordonnées et non ordonnées ainsi que l'imbrication.
la source
output.setSpan(...)
java.lang.RuntimeException: PARAGRAPH span must start at paragraph boundary
Si vous avez seulement besoin 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)
la source
Je suis venu ici à la recherche d'implémentations de TagHandler. Les réponses de Truong Nguyen et d'Aman Guatam sont très belles, mais j'avais besoin d'une version mixte des deux: j'avais besoin de ma solution pour ne pas la sur-formater et pour pouvoir résoudre les
<ol>
balises, puisque j'analyse quelque chose comme<h3>title</h3><ol><li>item</li><li>item</li><li>item</li></ol>
.Voici ma solution.
Notez que, puisque nous réinitialisons la valeur d'index chaque fois qu'une nouvelle liste démarre, cela NE fonctionnera PAS si vous imbriquez des listes comme dans
<ol><li>1<ol><li>1.1</li><li>1.2</li></ol><li>2</li></ol>
Avec ce code, vous obtiendrez
1, 1, 2, 3
au lieu de1, 1, 2, 2
.la source
Bien sûr, il existe un moyen d'afficher des puces dans Android TextView. Vous pouvez remplacer les
<li>
balises par•
(qui est le code HTML de la puce).Si vous voulez essayer d'autres icônes de liste, utilisez celle que vous préférez dans le tableau est ce lien;
http://www.ascii-code.com/
la source
Vous pouvez simplement remplacer le "li" par unicodes
la source
La réponse de Lord Voldermort est un bon point de départ. Cependant, j'avais besoin d'une
ol
balise pour afficher la liste ordonnée1. 2. 3. ....
au lieu de puces. De plus, les balises imbriquées nécessitent un traitement spécial pour fonctionner correctement.Dans mon code, je l' ai maintenu pile (parentList) de garder une trace de ouverte et fermée
ul
etol
balises et aussi de connaître l'étiquette actuelle ouverte. En outre, alevelWiseCounter
est utilisé pour conserver différents décomptes en cas deol
balises imbriquées .. . .
la source
Que diriez-vous du code suivant (basé sur ce lien ):
la source
J'ai eu le problème, que j'avais toujours une ligne vide après une liste avec la solution @Kuitsis. J'ai ajouté quelques lignes dans handleTag () et maintenant les lignes vides ont disparu:
la source
Vous pouvez utiliser
Html.TagHandler
. Ci-dessous peut être utilisé pour kotlinet
la source
ceci est une confirmation de ce que Kassim a déclaré. il y a fragmentation. j'ai trouvé comment résoudre ce problème. je dois renommer
<li>
et ul en une balise personnalisée. alors:puis dans mon gestionnaire je peux rechercher ce customTag (qui ne fait rien) et lui faire faire quelque chose.
cela devrait le faire fonctionner pour toutes les versions d'Android.
la source