Est-il possible de définir plusieurs styles pour différents morceaux de texte dans une TextView?
Par exemple, je mets le texte comme suit:
tv.setText(line1 + "\n" + line2 + "\n" + word1 + "\t" + word2 + "\t" + word3);
Est-il possible d'avoir un style différent pour chaque élément de texte? Par exemple, ligne1 en gras, mot1 en italique, etc.
Les tâches courantes du guide du développeur et comment les faire dans Android comprennent la sélection, la mise en évidence ou le style de parties de texte :
// 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);
Mais cela utilise des numéros de position explicites à l'intérieur du texte. Existe-t-il une façon plus propre de procéder?
Réponses:
Au cas où quelqu'un se demanderait comment faire cela, voici une façon: (Merci encore à Mark!)
Pour une liste non officielle des balises prises en charge par cette méthode, reportez-vous à ce lien ou à cette question: Quelles balises HTML sont prises en charge par Android TextView?
la source
formatTextWhite(string text)
qui vient d' insérer le texte dans la chaîne de format suivant:"<font size="..." color="..." face="...">%s</font>"
.Html.fromHtml("<![CDATA[<font color='#ffff5400'>the html content you already have</font>]]>");
? Je me souviens que cela a fonctionné pour moi. Je ne sais pas si cela fonctionne toujours.Html.fromHtml("<font color=\"#999999\">
les séquences d'échappement qui ont fonctionné pour moi :) ...mBox..setText(Html.fromHtml("<b>" + name + "</b>") + doNotApplyHTML);
aucune idée merciEssayez de
Html.fromHtml()
marquer votre texte avec des balises HTML en gras et en italique, par exemple:la source
monthText + " " + month.getYearLabel()
. Tu voisStringUtils.concat()
.monthYearLabel.setText(Html.fromHtml("<b>"+month.getMonthLabel().toUpperCase()+"</b> "+month.getYearLabel()))
si vous n'avez pas besoin des pièces individuelles.Légèrement hors sujet, mais j'ai trouvé cela trop utile pour ne pas être mentionné ici.
Et si nous voulions lire le texte Html de la ressource string.xml et ainsi le rendre facile à localiser. CDATA rend cela possible:
À partir de notre code Java, nous pourrions maintenant l'utiliser comme ceci:
Je ne m'attendais pas à ce que cela fonctionne. Mais ça l'a fait.
J'espère que c'est utile pour certains d'entre vous!
la source
"@string/someText"
(où "someText" est une ressource définie dans un strings.xml), je reçois simplement la chaîne avec toutes les balises HTML en tant que "texte".Si vous n'avez pas envie d'utiliser du HTML, vous pouvez simplement créer un styles.xml et l'utiliser comme ceci:
la source
$1%s is a happy $2%s
dans les faisceaux de chaînes. vous devez autoriser la réorganisation des jetons.Il est plus léger d'utiliser un
SpannableString
balisage au lieu de HTML. Cela m'aide à voir des exemples visuels alors voici une réponse supplémentaire.C'est un single
TextView
.Une étude plus approfondie
Cet exemple a été inspiré à l'origine d' ici .
la source
La liste des balises prises en charge est:
(De http://developer.android.com/guide/faq/commontasks.html#selectingtext - lien Web Archive, la
<resource>
faute de frappe est dans l'original!)Cela montre également que ce
Html.fromHtml
n'est pas vraiment nécessaire dans les cas simples.la source
Je rencontrais le même problème. Je pouvais utiliser fromHtml, mais je suis maintenant Android, pas web, j'ai donc décidé d'essayer cela. Je dois localiser cela, alors je l'ai essayé en utilisant le concept de remplacement de chaîne. J'ai défini le style sur TextView comme étant le style principal, puis je formate simplement les autres morceaux.
J'espère que cela aide les autres qui cherchent à faire la même chose - je ne sais pas pourquoi ce n'est pas plus facile dans le cadre.
Mes cordes ressemblent à ceci:
Voici les styles:
Voici mon code qui appelle ma méthode formatStyles:
La méthode de formatage:
la source
Maintenant, l'
<b>
élément est obsolète.<strong>
s'affiche en tant que<b>
et<em>
s'affiche en tant que<i>
.cela fonctionne bien pour moi
la source
Voici un moyen simple de le faire en utilisant HTMLBuilder
Résultat:
Du texte en gras Du texte en italique
la source
Si vous souhaitez pouvoir ajouter le texte stylisé en xml, vous pouvez créer une vue personnalisée étendant TextView et remplacer setText ():
Ensuite, vous pouvez l'utiliser comme ceci (remplacez-le
PACKAGE_NAME
par le nom de votre package):la source
Comme indiqué, utilisez
TextView.setText(Html.fromHtml(String))
Et utilisez ces balises dans votre chaîne au format HTML:
http://commonsware.com/blog/Android/2010/05/26/html-tags-supported-by-textview.html
la source
Moi aussi
Que diriez-vous d'utiliser un beau balisage avec Kotlin et Anko -
la source
Oui, il est possible d'utiliser
SpannedString
. Si vous utilisez Kotlin, cela devient encore plus facile à faire en utilisantcore-ktx
, car il fournit un langage spécifique au domaine (DSL) pour ce faire:Plus d'options fournies par lui sont:
Enfin, vous pouvez simplement:
la source
En fait, à l'exception de l'objet Html, vous pouvez également utiliser les classes de type Spannable, par exemple TextAppearanceSpan ou TypefaceSpan et SpannableString togather. La classe HTML utilise également ces mécanismes. Mais avec les classes de type Spannable, vous avez plus de liberté.
la source
Cela peut être aussi simple que d'utiliser la méthode length () de String:
Divisez la chaîne de texte du fichier XML Strings en autant de sous-chaînes (des chaînes distinctes du point de vue d'Android) que vous avez besoin de styles différents, de sorte que cela pourrait être comme: str1, str2, str3 (comme dans votre cas), qui, lorsqu'ils sont réunis, constituent la totalité de la chaîne unique que vous utilisez.
Et puis suivez simplement la méthode "Span", comme vous l'avez présenté avec votre code - mais au lieu d'une seule chaîne, combinez toutes les sous-chaînes en les fusionnant en une seule, chacune avec un style personnalisé différent.
Vous utilisez toujours les chiffres, mais pas directement - ils ne prennent plus de forme codée en dur (comme dans votre code) maintenant, mais ils sont remplacés par les méthodes combinées length () (notez deux étoiles précédant et suffixant la chaîne. longueur () à la place du nombre absolu pour prolonger le changement):
pour la première taille de chaîne, puis str.length () + 1, str.length () + str2.length () pour la deuxième taille de chaîne, et ainsi de suite avec toutes les sous-chaînes, au lieu de 0,7 ou 8,19 etc...
la source
Utilisation d'une classe auxiliaire pouvant être étendue en tant que partage de ressources de chaînes Android au bas de la page Web. Vous pouvez aborder cela en créant
CharSquences
et en leur donnant un style.Mais dans l'exemple qu'ils nous donnent, c'est juste pour le texte en gras, en italique et même en couleur. Je devais envelopper plusieurs styles dans un
CharSequence
afin de les définir dans unTextView
. Donc, à cette classe (je l'ai nomméeCharSequenceStyles
), je viens d'ajouter cette fonction.Et dans la vue, j'ai ajouté cela.
J'espère que cela vous aidera!
la source
Spanny facilite l'utilisation de SpannableString.
la source
Comme Jon l'a dit , pour moi, c'est la meilleure solution et vous n'avez pas besoin de définir de texte à l'exécution, utilisez uniquement cette classe personnalisée HtmlTextView
et c'est tout, maintenant seulement le mettre dans votre XML
avec votre chaîne Html
la source