créer un texte barré?

128

Puis-je créer un texte barré dans Android, je veux dire en ajoutant une valeur spéciale dans la TextViewbalise qui peut rendre cela possible?

<TextView
    android:id="@+id/title" 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:textColor="#040404"
    android:typeface="sans" 
    android:textSize="12dip"
    android:textStyle="bold"/>
nawfal cuteberg
la source

Réponses:

311

Paint.STRIKE_THRU_TEXT_FLAG

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

Pour peindre du texte, il existe plusieurs indicateurs de bits pour faire des choses comme gras, italique et oui barré. Donc, pour activer le barré, vous devez retourner le bit qui correspond à ce drapeau. La façon la plus simple de le faire est d'utiliser un indicateur au niveau du bit ou sur les indicateurs actuels et une constante qui correspond à un ensemble d'indicateurs avec uniquement l'indicateur barré activé.

Modifier à partir du commentaire de Ε Г И І И О :

Pour quiconque souhaite supprimer cet indicateur, voici comment:

someTextView.setPaintFlags(someTextView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
hovanessyan
la source
2
cela fonctionne vraiment, mais puis-je changer ses propriétés, je veux dire sa taille, sa couleur quelque chose comme ça
nawfal cuteberg
122
Pour quiconque souhaite supprimer ce drapeau, someTextView.setPaintFlags(someTextView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
voici
1
@ ΕГИІИО Que signifie le symbole ~?
Mathieu Castets
2
@BobbyJackson, c'est l'opérateur de complément unaire au niveau du bit.
Ε Г И І И О
3
@ ΕГИІИО il annule tous les bits. alors disons que strike_thru est 00100, alors ~ fait 11011. Si vous le faites avec les drapeaux existants, il conservera tous les drapeaux d'origine mais désactivera le bit strike_thru
Garçon
32

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
cela n'a pas été barré dans l'éditeur de l'interface utilisateur, mais il frappe le texte sur l'appareil
crier
1
Cela peut (et échouera probablement) dans l'API 21+
Martin Marconcini
Cette réponse a 3 ans. Je ne sais pas s'il est nécessaire de modifier les réponses en expliquant jusqu'à ce que l'API ou la version soit utile. S'il y a une règle dans stackoverflow qui le recommande au moins, je le ferai sans problème.
Ignacio Alorre
3
Cela a fonctionné dans tous les niveaux d'API sur lesquels j'ai testé (testé les 15, 25 et 27)
Randy
Certains appareils n'honorent pas des choses comme celle-ci ou le soulignement
James Riordan
26

Si vous utilisez Kotlin:

your_text_view.apply {
    paintFlags = paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
    text = "Striked thru text"
}
bko
la source
5
Et pour l'annuler:paintFlags = paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
relancez le
25

Vous pouvez le faire de trois manières, en définissant le premier plan dans TextViewou en définissant PaintFlagou en déclarant une chaîne comme <strike>your_string</strike>dans strings.xml. Par exemple,

Par PaintFlag

C'est la méthode la plus simple dont vous disposez pour définir l'indicateur barré sur votre TextView comme,

yourTextView.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG);

il frappera à travers votre TextView.

Au premier plan dessinable (fonctionne uniquement pour l'API 23+)

Si votre minSdkVersion est la version 23 + de l'API, vous pouvez parcourir votre TextView en définissant un premier plan comme,

<?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="@android:color/holo_red_dark"/>
        </shape>
    </item>
</selector>

Maintenant, il vous suffit de définir ci-dessus drawable dans votre TextView en tant que foreground. Par exemple,

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Your Textview with StrikeThrough"
    android:foreground="@drawable/strikethrough_foreground" />  <!-- this is available above --!>

Via strings.xml

Dans cette méthode, vous devez déclarer votre chaîne strings.xmlcomme barrée comme,

<string name="strike_line"> <strike>This line is strike throughed</strike></string>

Remarque

Mais je vous recommande de parcourir votre TextView en définissant un dessin au premier plan. Parce que grâce à drawable, vous pouvez facilement définir la couleur de votre ligne barrée (comme je l'ai définie comme couleur rouge dans l'exemple ci-dessus) ou la taille ou toute autre propriété de style. Alors que dans les deux autres méthodes, la couleur du texte par défaut est la couleur barrée.

Aditya S.
la source
19

essaye ça :

richTextView = (TextView)findViewById(R.id.rich_text);  

    // this is the text we'll be operating on  
    SpannableString text = new SpannableString("Lorem ipsum dolor sit amet");  

    text.setSpan(new ForegroundColorSpan(Color.RED), 0, 5, 0);  

    // make "ipsum" (characters 6 to 11) one and a half time bigger than the textbox  
    text.setSpan(new RelativeSizeSpan(1.5f), 6, 11, 0);  

    // make "dolor" (characters 12 to 17) display a toast message when touched  
    final Context context = this;  
    ClickableSpan clickableSpan = new ClickableSpan() {  
        @Override  
        public void onClick(View view) {  
            Toast.makeText(context, "dolor", Toast.LENGTH_LONG).show();  
        }  
    };  
    text.setSpan(clickableSpan, 12, 17, 0);  

    // make "sit" (characters 18 to 21) struck through  
    text.setSpan(new StrikethroughSpan(), 18, 21, 0);  

    // make "amet" (characters 22 to 26) twice as big, green and a link to this site.  
    // it's important to set the color after the URLSpan or the standard  
    // link color will override it.  
    text.setSpan(new RelativeSizeSpan(2f), 22, 26, 0);  
    text.setSpan(new URLSpan("http://www.djsad.com"), 22, 26, 0);  
    text.setSpan(new ForegroundColorSpan(Color.GREEN), 22, 26, 0);  

    // make our ClickableSpans and URLSpans work  
    richTextView.setMovementMethod(LinkMovementMethod.getInstance());  

    // shove our styled text into the TextView          
    richTextView.setText(text, BufferType.SPANNABLE); 
ρяσѕρєя K
la source
14

Je copie simplement ma réponse . J'espère que cela aidera pour quelqu'un 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
8

Utilisez simplement ceci et vous avez terminé. Pour l'activité:

TextView t= (TextView).findViewById(R.id.thousand));
t.setPaintFlags(t.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

Pour Xml:

<RelativeLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">

            <TextView
                android:id="@+id/text_view_original_cash_amount"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:padding="5dp"
                android:textColor="@android:color/darker_gray"
                android:text="Rs. 1,999"/>

            <View
                android:layout_width="wrap_content"
                android:layout_height="1dp"
                android:background="@android:color/darker_gray"
                android:layout_centerVertical="true"
                android:layout_alignStart="@id/text_view_original_cash_amount"
                android:layout_alignEnd="@id/text_view_original_cash_amount"
                android:layout_alignLeft="@id/text_view_original_cash_amount"
                android:layout_alignRight="@id/text_view_original_cash_amount" /> 
</RelativeLayout>
Hanisha
la source
Solution ingénieuse
Nishant Shah
Mais cette XMLsolution n'est pas trop complexe, je veux dire pour chaque vue de texte, vous devez ajouter une mise en page relative supplémentaire et une vue.
Aditya S.
Pour l'instant, je n'ai que cette solution, si j'obtiens une autre solution. Je dois partager avec vous.
Hanisha
6

Cela s'intègre parfaitement dans la liaison de données:

@BindingAdapter("strikethrough")
@JvmStatic
fun strikethrough(view: TextView, show: Boolean) {
    view.paintFlags = if (show) {
        view.paintFlags or STRIKE_THRU_TEXT_FLAG
    } else {
        view.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
    }
}

Puis dans votre xml:

    <TextView
        android:id="@+id/line_item_name"
        android:textAppearance="?attr/textAppearanceBody2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Club sandwich with ranch dressing"
        app:strikethrough="@{viewModel.isItemChecked}"/>
Daniel Wilson
la source
3

J'ai essayé quelques options ci-dessus, 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
L'élément en ligne de présentation HTML pour barré est <strike> ou <s> Cet élément a cependant été obsolète dans la norme HTML 4.01 de 1999 et remplacé par la balise <del>, un élément sémantique représentant le texte supprimé, que les agents utilisateurs (généralement navigateurs Web) s'affichent souvent sous la forme d'un barré. [3] [4] fr.wikipedia.org/wiki/Strikethrough Bien que non <del> pas <strike> fonctionne pour moi
lxknvlk
0

Dans votre modèle de vue observable

fun getStrikeContent(): String {
    return "Hello"
}


 companion object {
    @BindingAdapter("strike")
    @JvmStatic
    fun loadOldPrice(view: TextView, value: String) {
        view.text = value
        view.paintFlags = STRIKE_THRU_TEXT_FLAG
    }
}

puis dans votre xml

     <TextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         app:strike="@{itemViewModel.strikeContent}" />
ajaykoppisetty
la source