Existe-t-il un moyen simple de barrer du texte dans un widget d'application?


138

Je me demandais s'il existe un moyen simple de supprimer du texte dans un widget d'application sous Android. Dans une activité normale, c'est assez simple, en utilisant des indicateurs textview:

textView.setPaintFlags(textView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

Mais comme dans un widget app, je ne peux utiliser que des téléspectateurs ... je ne sais pas si c'est possible

Quelqu'un sait quelque chose à ce sujet?

Merci!



Si vous voulez une xml-onlysolution comme moi: stackoverflow.com/a/49062515/3579786
Jiyeh

Réponses:


68

Vous pouvez utiliser ceci:

remoteviews.setInt(R.id.YourTextView, "setPaintFlags", Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);

Bien sûr, vous pouvez également ajouter d'autres indicateurs de la classe android.graphics.Paint.


8
Je ne sais pas comment cela n'a pas obtenu plus de votes, cela répond parfaitement à la question. Merci.
James Cross

Tout d'abord, on ne sait pas ce que sont les révisions à distance, et ne fonctionne pas pour toutes les versions d'Android.
akshat tailang

C'est la réponse que nous recherchons, travailler avec des widgets d'application sur androidTextViews n'est accessible que via removeViews. Accéder directement à TextView n'est pas possible à ce stade.
endevour

188

Pour le faire par programme dans une vue de texte, non testée dans d'autres vues >>

TextView tv = (TextView) findViewById(R.id.mytext);
tv.setText("This is strike-thru");
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

13
Ce n'est pas possible pour les App-Widgets. Ils ne fonctionnent qu'avec RemoteViews et il n'existe aucune méthode pour lire les indicateurs de peinture.
Ridcully

78

Une autre façon de le faire par programmation qui ressemble un peu moins à un hack qu'à Paint:

Au lieu de faire:

tv.setText(s);

faire:

private static final StrikethroughSpan STRIKE_THROUGH_SPAN = new StrikethroughSpan();
...
tv.setText(s, TextView.BufferType.SPANNABLE);
Spannable spannable = (Spannable) tv.getText();
spannable.setSpan(STRIKE_THROUGH_SPAN, 0, s.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

Merci fonctionne comme un charme Surtout lorsque vous avez besoin d'une partie de TextView pour avoir une ligne
barrée

+1 Solution avec Spannable a fonctionné, merci beaucoup. Tu as sauvé ma journée. Thanks man;)
Simon Dorociak

Cela ne répond pas à la question car cela ne s'applique pas àRemoteView
Alex.F

@ Alex.FI suis un peu surpris car cela fonctionne par exemple dans les notifications (qui sont des vues distantes). Je dois admettre que je n'ai pas testé avec AppWidgets.
BoD

1
Cela fonctionne avec les widgets d'application (toute étendue de cadre qui implémente ParcelableSpan devrait fonctionner)
Karsten

58

Mise à jour 2015: Mes amis, c'est pour les très anciennes versions d'Android. Voir d'autres réponses pour des solutions modernes!


Pour parcourir l'ensemble de la vue du texte, vous pouvez utiliser une image d'arrière-plan spécifique pour simuler l'effet barré:

android:background="@drawable/bg_strikethrough"

Où le bg_strikethroughdessinable est un patch 9 qui garde une ligne continue au milieu, poussant de chaque côté, avec autant de rembourrage que vous pensez raisonnable. J'en ai utilisé un comme celui-ci:

texte alternatif

(agrandi pour plus de clarté .. 1300%!)

texte alternatif

C'est ma version HDPI, alors enregistrez-la (la première http://i.stack.imgur.com/nt6BK.png ) car res/drawable-hdpi/bg_strikethrough.9.pnget la configuration fonctionnera comme suit:

texte alternatif


et que faire si le TextView est plus long que le texte et que seul le texte doit être barré?
maysi

seulement pour le texte noir et une ligne ... @ruhalde a fonctionné pour moi.
ahmed_khan_89

27

Pour ce faire, vous pouvez utiliser ceci

 title.setPaintFlags(title.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

et pour supprimer, vous pouvez utiliser ceci

 title.setPaintFlags(title.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));

1
comment puis-je ajouter une couleur de grève
Harsha

@Harsha cela semble ne vous permettre d'utiliser que la couleur du texte. Si vous voulez une couleur barrée différente, vous devrez essayer une autre méthode d'implémentation.
Michael

19

Si vous avez un seul mot, nous pouvons utiliser drawable. Voici l'exemple:

<item android:state_pressed="false"><shape android:shape="line">
        <stroke android:width="2dp" android:color="#ffffff" />
    </shape>
</item>

si vous avez plusieurs lignes, vous pouvez utiliser le code suivant:

TextView someTextView = (TextView) findViewById(R.id.some_text_view);
someTextView.setText(someString);
someTextView.setPaintFlags(someTextView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG)

@Skizo Je suis heureux que cela vous ait aidé
Akshay Mukadam

14

Voici une extension pour tous les amis de Kotlin

fun TextView.showStrikeThrough(show: Boolean) {
    paintFlags =
            if (show) paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
            else paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
}

Usage

textView.showStrikeThrough(true)

Limitation

Les barrés ne peuvent avoir que la même couleur que le texte

(c'est-à-dire que le texte rouge et le barré bleu ne sont pas possibles)


9

Pour TextView multiligne, vous devez utiliser android.text.style.CharacterStyle comme ceci:

SpannableString spannable = new SpannableString(text);
spannable.setSpan(new StrikethroughSpan(), 0, text.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
remoteViews.setTextViewText(R.id.itemText, spannable);

8

C'est vraiment simple si vous utilisez des chaînes:

<string name="line"> Not crossed <strike> crossed </strike> </string>

Et puis juste:

<TextView 
        ...
         android:text="@string/line"
 />

4
@war_Hero a fonctionné pour moi, mais ne s'affiche pas dans le moteur de rendu d'Android Studio. Il a fallu le construire pour le voir.
Mic Fok

8

Ajoutez la ligne ci-dessous: -

TextView tv=(TextView) v.findViewById(android.R.id.text1);
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

utilisez votre référence au lieu de "tv"


1
Cela ne fait pas référence à la question, il pose des questions sur un objet RemoteViews dans un AppWidget.
Matthieu

3

essayez ce code

textview.setText((Html.fromHtml("<strike>hello world!</strike>")));

2

Pour Lollipop et plus. créer un dessin

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="false">
        <shape android:shape="line">
            <stroke android:width="1dp"
                android:color="@color/onePlusRed" />
        </shape>
    </item>
</selector>

et utilisez-le comme premier plan.
android:foreground="@drawable/strike_through"


cela ne fonctionnera que pour les textes sur une seule ligne car il dépend de la vue
Billy

0

vous ajoutez:

TextView variableTv = (TextView) findViewById(R.id.yourText);

vous définissez / ajoutez votre variable:

variableTv.setText("It's Text use Style Strike");

puis ajoutez .setPaintFlags dans variableTv:

variableTv.setPaintFlags(variableTv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

0

J'ai essayé quelques options, mais cela fonctionne mieux pour moi:

String text = "<strike><font color=\'#757575\'>Some text</font></strike>";
textview.setText(Html.fromHtml(text));

à votre santé


0

Les ressources Android ont une assez bonne prise en charge du balisage HTML
Les éléments HTML ci-dessous sont pris en charge:

Bold: <b>, <em>
Italic: <i>, <cite>, <dfn>
25% larger text: <big>
20% smaller text: <small>
Setting font properties: <font face=”font_family color=”hex_color”>. Examples of possible font families include monospace, serif, and sans_serif.
Setting a monospace font family: <tt>
Strikethrough: <s>, <strike>, <del>
Underline: <u>
Superscript: <sup>
Subscript: <sub>
Bullet points: <ul>, <li>
Line breaks: <br>
Division: <div>
CSS style: <span style=”color|background_color|text-decoration”>
Paragraphs: <p dir=”rtl | ltr style=”…”>

Notez cependant qu'il n'est pas rendu dans l'aperçu des mises en page du studio Android. Dernier test sur Android Studio 3.3.1

Par exemple, le barré ressemblera à ceci:

<string name="cost"><strike>$10</strike> $5 a month</string>

-1

J'ai fait cela sur un régulier (local) TextView, et cela devrait fonctionner sur la variété distante puisque la documentation répertorie la méthode comme équivalente entre les deux:

remote_text_view.setText(Html.fromHtml("This is <del>crossed off</del>."));


Cela ne fonctionne pas :(. Je fais ceci: remoteView.setTextViewText (R.id.text, Html.fromHtml ("<del>" + value + "</del>"));
Antonio

Il se peut que ce <del>ne soit pas pris en charge par Html.fromHtml(). Avez-vous essayé <strike>ou <s>?
Blrfl

Merci Blrfl, mais ça ne marche pas non plus. Il semble que seules quelques balises HTML soient supportées par Html.fromHtml ().
Antonio

Dommage. Désolé, je n'ai pas pu aider.
Blrfl

comment puis-je obtenir un prix avec des applications d'achat comme des offres
Harsha

-1

Je sais, je réponds à une vieille question, cela pourrait être utile pour quelqu'un d'autre, pour supprimer une partie particulière de TextView par programme.

TextView textView = (TextView) findViewById(R.id.textView);
textView.setText("Text need to be set here", TextView.BufferType.SPANNABLE);
Spannable spannable = (Spannable) textView.getText();
spannable.setSpan(new StrikethroughSpan(), 5, 8, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

Ainsi, dans cet exemple de code, 5 est la position de départ et 8 est la position de fin du texte qui doit être rayé, donc après avoir exécuté ce code, nous pouvons obtenir le texte "besoin" avec barré. J'espère que cela sera utile pour quelqu'un d'autre.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.