A tag Html List não funciona no Android TextView. Este é o meu conteúdo de string:
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>";
Eu carreguei em uma visualização de texto como esta:
textview.setText(Html.fromHtml(str));
A saída parece um parágrafo. O que eu posso fazer? Existe alguma solução para isso?
Editar:
webview.loadData(str,"text/html","utf-8");
Respostas:
Como você pode ver no
Html
código-fonte da classe ,Html.fromHtml(String)
não oferece suporte a todas as tags HTML. Neste mesmo caso,<ul>
e<li>
não são suportados.A partir do código-fonte, construí uma lista de tags HTML permitidas:
br
p
div
em
b
strong
cite
dfn
i
big
small
font
blockquote
tt
monospace
a
u
sup
sub
Então é melhor você usar
WebView
e seuloadDataWithBaseURL
método. Experimente algo assim:fonte
Estou tendo o mesmo problema, o que fiz foi substituir o TagHandler padrão . Este funcionou para mim.
e para exibir o texto ...
[Editar]
Kuitsi também postou uma biblioteca muito boa que faz o mesmo, obteve neste link do SO .
fonte
O projeto de amostra completo está localizado em https://bitbucket.org/Kuitsi/android-textview-html-list .
A imagem de amostra está disponível em https://kuitsi.bitbucket.io/stackoverflow3150400_screen.png
Esta solução está mais próxima da resposta de masha . Algum código também é obtido da classe interna
android.text.Html.HtmlToSpannedConverter
. Ele suporta listas aninhadas ordenadas e não ordenadas, mas textos muito longos em listas ordenadas ainda estão alinhados com o número do item em vez do texto. Listas mistas (ol e ul) também precisam de algum trabalho. O projeto de amostra contém a implementação de Html.TagHandler que é passado para Html.fromHtml (String, ImageGetter, TagHandler) .Editar: para um suporte mais amplo de tag HTML, https://github.com/NightWhistler/HtmlSpanner também pode valer a pena tentar.fonte
output.length() > 0
como emif (output.length() > 0 && output.charAt(output.length() - 1) != '\n')
Uma pequena correção para o código Aman Guatam. A função acima tem problemas para renderizar caracteres de nova linha. Por exemplo: se before
<li>
tag for uma<p>
tag, 2 caracteres de nova linha são renderizados. Aqui está o código atualizado:fonte
AVISO
a partir de 10 de fevereiro de 2016,
android.text.Html
na verdade, suportali
eul
marca e usa um básiconew BulletSpan()
, o que significa que nas versões mais recentes do Android asHtml.TagHandler
soluções postadas aqui serão ignoradascertifique-se de que seu código lida com essa mudança, caso você esteja esperando um BulletSpan com uma lacuna maior do que o padrão, você terá que ter algum tipo de solução que encontre / substitua os spans
fonte
N
e superior.Solução diferente usando LeadingMarginSpan. Lida com listas ordenadas e não ordenadas, bem como aninhamento.
fonte
output.setSpan(...)
java.lang.RuntimeException: PARAGRAPH span must start at paragraph boundary
Se você só precisa formatar uma lista, mantenha-a simples e copie / cole um caractere Unicode em seu TextView para obter o mesmo resultado.
• Caractere Unicode 'BULLET' (U + 2022)
fonte
Vim aqui procurando implementações do TagHandler. As respostas de Truong Nguyen e Aman Guatam são muito boas, mas eu precisava de uma versão mista de ambas: eu precisava da minha solução para não superformatá-la e ser capaz de resolver
<ol>
tags, já que estou analisando algo como<h3>title</h3><ol><li>item</li><li>item</li><li>item</li></ol>
.Aqui está minha solução.
Observe que, uma vez que estamos redefinindo o valor do índice sempre que uma nova lista começa, NÃO funcionará se você aninhar listas como em
<ol><li>1<ol><li>1.1</li><li>1.2</li></ol><li>2</li></ol>
Com esse código, você obteria
1, 1, 2, 3
vez de1, 1, 2, 2
.fonte
Claro, existe uma maneira de mostrar marcadores no Android TextView. Você pode substituir
<li>
tags por•
(que é o código HTML para marcador).Se quiser experimentar outros ícones de lista, use o preferido da tabela neste link;
http://www.ascii-code.com/
fonte
Você pode simplesmente substituir o "li" por unicodes
fonte
A resposta de Lord Voldermort é um bom ponto de partida. No entanto, eu
ol
exigi a tag para exibir a lista ordenada em1. 2. 3. ....
vez de marcadores. Além disso, as tags aninhadas precisam de tratamento especial para funcionar corretamente.No meu código, eu tenho mantido pilha (parentList) para acompanhar abertos e fechados
ul
eol
tags e também para conhecer a tag aberta atual. Além disso, alevelWiseCounter
é usado para manter contagens diferentes no caso deol
tags aninhadas .. . .
fonte
E quanto ao próximo código (com base neste link ):
fonte
Eu tinha o problema, que sempre obtinha uma linha vazia após uma lista com a solução @Kuitsis. Eu adicionei algumas linhas em handleTag () e agora as linhas vazias sumiram:
fonte
Você pode usar
Html.TagHandler
. Abaixo pode ser usado para kotline
fonte
esta é uma confirmação do que kassim declarou. há fragmentação. eu descobri como resolver isso. eu tenho que renomear
<li>
e ul para uma marca personalizada. tão:então, em meu manipulador, posso procurar aquela customTag (que não faz nada) e fazer com que ela faça alguma coisa.
isso deve funcionar para todas as versões do Android.
fonte