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!

Antonio
la source
Voir ma réponse ici! stackoverflow.com/a/35351523/250260
Jorgesys
Si vous voulez une xml-onlysolution comme moi: stackoverflow.com/a/49062515/3579786
Jiyeh
1
cela peut aider ... 6 façons - Android TextView StrikeThrough
c49

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.

agirardello
la source
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);
Ruhalde
la source
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);
BoD
la source
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

ohhorob
la source
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));
Pavel
la source
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)
Akshay Mukadam
la source
@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)

Michael
la source
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);
utilisateur3768270
la source
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"
 />
Ignacio Alorre
la source
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"

ChandraMouli Poreddy
la source
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>")));
Abhishek c
la source
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"

Akshay Plus
la source
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);
Briliant Fay
la source
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é

Milos Simic Simo
la source
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>
Ilya Gazman
la source
-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>."));

Blrfl
la source
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.

Ram Koti
la source