É possível definir vários estilos para diferentes partes do texto dentro de um TextView?
Por exemplo, estou definindo o texto da seguinte maneira:
tv.setText(line1 + "\n" + line2 + "\n" + word1 + "\t" + word2 + "\t" + word3);
É possível ter um estilo diferente para cada elemento do texto? Por exemplo, linha1 em negrito, palavra1 em itálico etc.
As tarefas comuns do guia do desenvolvedor e como executá-las no Android incluem partes de texto para seleção, destaque ou estilo :
// Get our EditText object. EditText vw = (EditText)findViewById(R.id.text); // Set the EditText's text. vw.setText("Italic, highlighted, bold."); // If this were just a TextView, we could do: // vw.setText("Italic, highlighted, bold.", TextView.BufferType.SPANNABLE); // to force it to use Spannable storage so styles can be attached. // Or we could specify that in the XML. // Get the EditText's internal text storage Spannable str = vw.getText(); // Create our span sections, and assign a format to each. str.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 0, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); str.setSpan(new BackgroundColorSpan(0xFFFFFF00), 8, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); str.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 21, str.length() - 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
Mas isso usa números de posição explícitos dentro do texto. Existe uma maneira mais limpa de fazer isso?
Respostas:
Caso alguém esteja se perguntando como fazer isso, aqui está uma maneira: (Obrigado a Mark novamente!)
Para obter uma lista não oficial de tags suportadas por esse método, consulte este link ou esta pergunta: Quais tags HTML são suportadas pelo Android TextView?
fonte
formatTextWhite(string text)
que só insere o texto na seguinte seqüência de formato:"<font size="..." color="..." face="...">%s</font>"
.Html.fromHtml("<![CDATA[<font color='#ffff5400'>the html content you already have</font>]]>");
:? Lembro que isso funcionou em algum momento para mim. Não tenho certeza se ainda funciona.Html.fromHtml("<font color=\"#999999\">
as sequências de escape trabalhou para mim:) ...mBox..setText(Html.fromHtml("<b>" + name + "</b>") + doNotApplyHTML);
alguma idéia graçasExperimente
Html.fromHtml()
e marque seu texto com tags HTML em negrito e itálico, por exemplo:fonte
monthText + " " + month.getYearLabel()
. VejaStringUtils.concat()
.monthYearLabel.setText(Html.fromHtml("<b>"+month.getMonthLabel().toUpperCase()+"</b> "+month.getYearLabel()))
se não precisar das peças individuais.Um pouco fora do tópico, mas achei útil demais para não ser mencionado aqui.
E se gostaríamos de ler o texto Html do recurso string.xml e, assim, facilitar a localização. O CDATA torna isso possível:
A partir do nosso código Java, agora podemos utilizá-lo desta forma:
Eu não esperava que isso funcionasse. Mas sim.
Espero que seja útil para alguns de vocês!
fonte
"@string/someText"
(onde "someText" é um recurso definido em um arquivo strings.xml), recebo a cadeia de caracteres com todas as tags HTML como 'texto'.Se você não quiser usar html, crie um styles.xml e use-o assim:
fonte
$1%s is a happy $2%s
em pacotes de strings. você precisa permitir que os tokens sejam reorganizados.É mais leve usar uma
SpannableString
marcação em vez de html. Isso me ajuda a ver exemplos visuais, então aqui está uma resposta suplementar.Este é um single
TextView
.Um estudo mais aprofundado
Este exemplo foi originalmente inspirado a partir daqui .
fonte
A lista de tags suportadas é:
(Em http://developer.android.com/guide/faq/commontasks.html#selectingtext - link Arquivo da web, o
<resource>
erro de digitação está no original!)Também mostra que
Html.fromHtml
não é realmente necessário em casos simples.fonte
Eu estava com o mesmo problema. Eu poderia usar fromHtml, mas agora sou android, não web, então decidi tentar isso. Eu tenho que localizar isso, então eu dei uma chance usando o conceito de substituição de string. Defino o estilo no TextView como o estilo principal e, em seguida, apenas formato as outras partes.
Espero que isso ajude outras pessoas que desejam fazer a mesma coisa - não sei por que isso não é mais fácil na estrutura.
Minhas cordas ficam assim:
Aqui estão os estilos:
Aqui está o meu código que chama meu método formatStyles:
O método de formato:
fonte
Agora o
<b>
elemento está obsoleto.<strong>
renderiza como<b>
e<em>
renderiza como<i>
.Este trabalho é bom para mim
fonte
Aqui está uma maneira fácil de fazer isso usando HTMLBuilder
Resultado:
Algum texto em negrito Algum texto em itálico
fonte
Se você quiser adicionar o texto estilizado em xml, poderá criar uma exibição personalizada estendendo o TextView e substituir setText ():
Em seguida, você pode usá-lo assim (substitua
PACKAGE_NAME
pelo nome do seu pacote):fonte
Conforme declarado, use
TextView.setText(Html.fromHtml(String))
E use essas tags na sua string formatada em HTML:
http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html
fonte
Eu também
Que tal usar uma bela marcação com Kotlin e Anko -
fonte
Sim, é possível usar
SpannedString
. Se você estiver usando o Kotlin, fica ainda mais fácil usarcore-ktx
, pois fornece uma linguagem específica de domínio (DSL) para fazer isso:Mais opções fornecidas por ele são:
Por fim, você pode apenas:
fonte
De fato, exceto o objeto Html, você também pode usar as classes de tipo Spannable, por exemplo, TextAppearanceSpan ou TypefaceSpan e SpannableString. A classe HTML também usa esses mecanismos. Mas com as classes do tipo Spannable, você tem mais liberdade.
fonte
Pode ser tão simples quanto aproveitar o método length () da String:
Divida a string de texto no arquivo XML Strings em tantas sub-strings (uma string separada do ponto de vista do Android) quanto você precisar de estilos diferentes, para que possa ser como: str1, str2, str3 (como no seu caso), que, quando unidas, são toda a sequência que você usa.
E, em seguida, basta seguir o método "Span", exatamente como você apresentou com seu código - mas, em vez de uma única string, combine todas as substrings que as fundem em uma única, cada uma com um estilo personalizado diferente.
Você ainda usa os números, mas não diretamente - eles não assumem uma forma codificada (como no seu código) agora, mas estão sendo substituídos pelos métodos length () combinados (observe duas estrelas precedendo e sufixando o str. length () no lugar do número absoluto para extinção da alteração):
para o primeiro tamanho de string, str.length () + 1, str.length () + str2.length () para o segundo tamanho de string, e assim por diante com todas as substrings, em vez de, por exemplo, 0,7 ou 8,19 e assim por diante...
fonte
O uso de uma classe Spannable auxiliar como o Android String Resources compartilha na parte inferior da página da web. Você pode abordar isso criando
CharSquences
e dando a eles um estilo.Mas no exemplo que eles nos dão, é apenas para texto em negrito, itálico e até mesmo para colorir. Eu precisava agrupar vários estilos em um
CharSequence
para defini-los em umTextView
. Então, para essa classe (eu o nomeeiCharSequenceStyles
), acabei de adicionar essa função.E na visão eu adicionei isso.
Espero que isso lhe ajude!
fonte
Spanny torna o SpannableString mais fácil de usar.
fonte
Como Jon disse , para mim esta é a melhor solução e você não precisa definir nenhum texto em tempo de execução, use apenas essa classe personalizada HtmlTextView
e é isso, agora só coloque no seu XML
com sua String Html
fonte