web-dev-qa-db-fra.com

Spécification de "barré" sur une section de texte TextView

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.

29
RMS2

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);
92
Suresh Manchi

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.

27
Rohan Kandwal

Voici une solution utilisant un TagHandler personnalisé que vous devez passer à Html.fromHtml ().

Android: Comment utiliser le Html.TagHandler?

1
Ridcully

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);
    }
}
....
1
Marcelo

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

0
Maciej Łopaciński

Etes-vous sûr que Html.fromHtml ne supporte pas <strike>? Il est listé dans cet article de blog Commonsware

0
Wayne