La etiqueta de lista HTML no funciona en Android TextView. Este es mi contenido de cadena:
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>";
Lo cargué en una vista de texto como esta:
textview.setText(Html.fromHtml(str));
La salida parece un párrafo. ¿Que puedo hacer? ¿Existe alguna solución para ello?
Editar:
webview.loadData(str,"text/html","utf-8");
Respuestas:
Como puede ver en el
Html
código fuente de la clase ,Html.fromHtml(String)
no es compatible con todas las etiquetas HTML. En este mismo caso,<ul>
y<li>
no son compatibles.A partir del código fuente, he creado una lista de etiquetas HTML permitidas:
br
p
div
em
b
strong
cite
dfn
i
big
small
font
blockquote
tt
monospace
a
u
sup
sub
Así que es mejor utilizar
WebView
y suloadDataWithBaseURL
método. Intente algo como esto:fuente
Tengo el mismo problema, lo que hice fue anular el TagHandler predeterminado . Este funcionó para mí.
y para mostrar el texto ...
[Editar]
Kuitsi también ha publicado una biblioteca realmente buena que hace lo mismo, la obtuve de este enlace SO .
fuente
El proyecto de muestra completo se encuentra en https://bitbucket.org/Kuitsi/android-textview-html-list .
La imagen de muestra está disponible en https://kuitsi.bitbucket.io/stackoverflow3150400_screen.png
Esta solución es la más cercana a la respuesta de masha . También se toma parte de código de la clase interna
android.text.Html.HtmlToSpannedConverter
. Admite listas ordenadas y desordenadas anidadas, pero los textos demasiado largos en listas ordenadas todavía se alinean con el número de artículo en lugar del texto. Las listas mixtas (ol y ul) también necesitan algo de trabajo. El proyecto de muestra contiene la implementación de Html.TagHandler que se pasa a Html.fromHtml (String, ImageGetter, TagHandler) .Editar: para un soporte más amplio de etiquetas HTML, también puede valer la pena probar https://github.com/NightWhistler/HtmlSpanner .fuente
output.length() > 0
como enif (output.length() > 0 && output.charAt(output.length() - 1) != '\n')
Una pequeña corrección para el código de Aman Guatam. La función anterior tiene el problema de representar el carácter de nueva línea. Por ejemplo: si antes de la
<li>
etiqueta es una<p>
etiqueta, se representan 2 caracteres de nueva línea. Aquí está el código actualizado:fuente
ADVERTENCIA
a partir del 10 de febrero de 2016, en
android.text.Html
realidad admiteli
yul
etiqueta y usa un básiconew BulletSpan()
, lo que significa que en las últimas versiones de Android lasHtml.TagHandler
soluciones publicadas aquí serán ignoradasasegúrese de que su código maneje este cambio en caso de que esté esperando un BulletSpan con un espacio mayor que el predeterminado, tendrá que tener algún tipo de solución que busque / reemplace los tramos
fuente
N
y versiones posteriores.Solución diferente usando LeadingMarginSpan. Maneja listas ordenadas y desordenadas, así como anidaciones.
fuente
output.setSpan(...)
sejava.lang.RuntimeException: PARAGRAPH span must start at paragraph boundary
Si solo necesita formatear una lista, manténgalo simple y copie / pegue un carácter Unicode en su TextView para lograr el mismo resultado.
• Carácter Unicode 'BULLET' (U + 2022)
fuente
Vine aquí buscando implementaciones de TagHandler. Las respuestas de Truong Nguyen y Aman Guatam son muy agradables, pero necesitaba una versión mixta de ambas: necesitaba mi solución para no sobreformatearla y poder resolver
<ol>
etiquetas, ya que estoy analizando algo como<h3>title</h3><ol><li>item</li><li>item</li><li>item</li></ol>
.Esta es mi solución.
Tenga en cuenta que, dado que estamos restableciendo el valor del índice cada vez que comienza una nueva lista, NO funcionará si anida listas como en
<ol><li>1<ol><li>1.1</li><li>1.2</li></ol><li>2</li></ol>
Con ese código, obtendría en
1, 1, 2, 3
lugar de1, 1, 2, 2
.fuente
Claro, hay una forma de mostrar viñetas en Android TextView. Puede reemplazar las
<li>
etiquetas con•
(que es código HTML para viñeta).Si desea probar otros íconos de lista, use el preferido de la tabla que es este enlace;
http://www.ascii-code.com/
fuente
Simplemente puede reemplazar el "li" con unicodes
fuente
La respuesta de Lord Voldermort es un buen punto de partida. Sin embargo, necesitaba que la
ol
etiqueta mostrara una lista ordenada en1. 2. 3. ....
lugar de viñetas. Además, las etiquetas anidadas necesitan un manejo especial para funcionar correctamente.En mi código, he mantenido pila (ParentList) para realizar un seguimiento de abierta y cerrada
ul
yol
etiquetas, y también para conocer la etiqueta abierta en ese momento. Además,levelWiseCounter
se utiliza para mantener diferentes recuentos en caso deol
etiquetas anidadas .. . .
fuente
¿Qué tal el siguiente código (basado en este enlace ):
fuente
Tuve el problema de que siempre obtenía una línea vacía después de una lista con la solución @Kuitsis. Agregué algunas líneas en handleTag () y ahora las líneas vacías se han ido:
fuente
Puede utilizar
Html.TagHandler
. A continuación se puede utilizar para kotliny
fuente
esto es una confirmación de lo que ha dicho kassim. hay fragmentación. Encontré cómo resolver esto. tengo que cambiar el nombre
<li>
y ul a una etiqueta personalizada. entonces:luego, en mi controlador, puedo buscar esa etiqueta personalizada (que no hace nada) y hacer que haga algo.
esto debería hacer que funcione para todas las versiones de Android.
fuente