J'ai un bloc de texte provenant d'un service Web et, en fonction de certaines balises que j'ai prédéfinies, je souhaite styliser le texte avant de le définir sur TextView. Pour les caractères gras, italiques et soulignés, j'ai pu le faire facilement avec la commande replaceAll:
PageText = PageText.replaceAll("\\*([a-zA-Z0-9]+)\\*", "<b>$1</b>");
PageText = PageText.replaceAll("=([a-zA-Z0-9]+)=", "<i>$1</i>");
PageText = PageText.replaceAll("_([a-zA-Z0-9]+)_", "<u>$1</u>");
txtPage.setText(Html.fromHtml(PageText), TextView.BufferType.SPANNABLE);
Donc, pour mettre un mot en gras, entourez-le de *, pour l'italique, entourez de _.
Mais, pour le barré, Html.fromHtml ne supporte pas la balise "strike", cela ne peut donc pas être fait de la même manière. J'ai vu des exemples d'utilisation de Spannable pour définir le style sur une section de texte, mais cela nécessite des numéros de position. Donc, je suppose que je pourrais parcourir le texte en cherchant - (la balise représentant la frappe), puis en cherchant la suivante, couvrant le texte entre les deux et répétant toutes ces chaînes. Il s'agira finalement de 10 lignes de code en boucle, par opposition à 1 pour les autres. Je me demande donc s'il existe une solution plus élégante.
S'il ne s'agit que de TextView, vous pouvez passer à l'aide des indicateurs de peinture.
TextView tv=(TextView) v.findViewById(Android.R.id.text1);
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
La solution @Suresh fonctionne si vous voulez biffer l'intégralité de TextView mais si vous voulez biffer seulement certaines parties du texte, utilisez le code ci-dessous.
tvMRP.setText(text, TextView.BufferType.SPANNABLE);
Spannable spannable = (Spannable) tvMRP.getText();
spannable.setSpan(new StrikethroughSpan(), 3, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
Ici text
est le texte que nous voulons que TextView affiche, 3
est le no. de caractères (à partir de 0) à partir duquel le barré commencera.
Voici une solution utilisant un TagHandler personnalisé que vous devez passer à Html.fromHtml ().
Vous pouvez le faire avec une variable TagHandler
telle que celle sur cette SO question :
Spanned parsed = Html.fromHtml(PageText, null, new MyHtmlTagHandler());
Et la TagHandler
implémente les méthodes:
public void handleTag(boolean opening, String tag, Editable output,
XMLReader xmlReader) {
if(tag.equalsIgnoreCase("strike") || tag.equals("s")) {
processStrike(opening, output);
}
}
....
Il semble que ce n’est pas vraiment supporté, au moins cela ne fonctionne pas sur Android 3.1.
@ RMS2 si le texte est petit, vous pouvez le scinder en deux ou trois vues de texte distinctes et appliquer le drapeau uniquement à celle que vous voulez, ce qui ne convient pas aux textes longs
Etes-vous sûr que Html.fromHtml
ne supporte pas <strike>
? Il est listé dans cet article de blog Commonsware