creando un testo barrato?


128

Posso creare un testo barrato in Android, intendo aggiungere un valore speciale nel TextViewtag che può renderlo possibile?

<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"/>



Risposte:


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);

Per dipingere il testo, ci sono diversi bit flags per fare cose come grassetto, corsivo e sì barrato. Quindi, per abilitare il barrato, è necessario capovolgere il bit corrispondente a questo flag. Il modo più semplice per farlo è utilizzare un flag bit per bit o corrente e una costante che corrisponde a un set di flag con solo il flag barrato abilitato.

Modifica dal commento di Ε Г И І И О :

Per chiunque desideri rimuovere questo flag, ecco come:

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

2
funziona davvero, ma posso cambiare le sue proprietà intendo le sue dimensioni, il suo colore qualcosa del genere
nawfal cuteberg

122
Per chiunque voglia rimuovere questa bandiera, ecco come:someTextView.setPaintFlags(someTextView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
Ε Г И І И О

1
@ ΕГИІИО cosa significa il simbolo ~?
Mathieu Castets,

2
@BobbyJackson, che è l'operatore unario bit per complemento.
Ε Г И І И О

3
@ ΕГИІИО ripristina tutti i bit. quindi diciamo che strike_thru è 00100, quindi ~ fa 11011. Se poi lo fai con le bandiere esistenti, manterrà tutte le bandiere originali ma disattiverà il bit strike_thru
Ragazzo

32

È davvero facile se stai usando le stringhe:

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

E poi solo:

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

questo non è stato mostrato come barrato nell'editor dell'interfaccia utente, ma colpisce il testo sul dispositivo
yarell,

1
Questo potrebbe (e probabilmente fallirà) nell'API 21+
Martin Marconcini,

Questa risposta ha 3 anni. Non sono sicuro se sia necessario modificare le risposte spiegando fino a che API o versione sono utili. Se c'è una regola in StackOverflow che almeno lo ha raccomandato, lo farò senza problemi.
Ignacio Alorre,

3
Funzionava in tutti i livelli API su cui ho provato (testato il 15, 25 e 27)
Randy

Alcuni dispositivi non onorano cose come questa o la sottolineatura
James Riordan

26

Se stai usando Kotlin:

your_text_view.apply {
    paintFlags = paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
    text = "Striked thru text"
}

5
E per annullarlo:paintFlags = paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
annulla il

25

Puoi farlo in tre modi, impostando in primo piano TextViewo impostando PaintFlago dichiarando una stringa come <strike>your_string</strike>instrings.xml . Per esempio,

Attraverso PaintFlag

Questo è il metodo più semplice per impostare il flag barrato su TextView come,

yourTextView.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG);

colpirà attraverso il tuo TextView.

Attraverso il disegno in primo piano (funziona solo per API 23+)

Se minSdkVersion è l'API versione 23+, puoi accedere a TextView impostando un primo piano come,

<?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>

Ora, devi solo impostare il drawable sopra in TextView come foreground. Per esempio,

<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 --!>

Attraverso strings.xml

In questo metodo, devi dichiarare la stringa strings.xmlcome barrata come,

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

Nota

Ma ti consiglio di colpire TextView impostando in primo piano un disegno. Perché attraverso il disegno puoi impostare facilmente il colore della linea barrata (come ho impostato come colore rosso nell'esempio sopra) o la dimensione o qualsiasi altra proprietà di stile. Mentre negli altri due metodi il colore predefinito del testo è barrato.


19

prova questo :

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); 

14

Sto solo copiando la mia risposta . Spero che sia d'aiuto per qualcuno Se hai una sola parola possiamo usare il disegno. Di seguito è riportato l'esempio:

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

se hai più righe puoi usare il seguente codice:

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

8

Basta usare questo e il gioco è fatto. Per attività:

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

Per 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>

Soluzione
geniale

Ma questa XMLsoluzione non è troppo complessa, intendo per ogni visualizzazione di testo che devi aggiungere un layout relativo aggiuntivo e una vista.
Aditya S.

Per ora, ho solo questa soluzione, se ottengo un'altra soluzione. Devo condividere con te.
Hanisha,

6

Questo si adatta perfettamente al database:

@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()
    }
}

Quindi nel tuo 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}"/>

3

Ho provato alcune opzioni sopra, ma questo funziona meglio per me:

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

Saluti


L'elemento inline di presentazione HTML per barrato è <strike> o <s> Questo elemento, tuttavia, è stato deprecato nello standard HTML 4.01 del 1999 e sostituito dal tag <del>, un elemento semantico che rappresenta il testo eliminato, che gli user agent (in genere browser Web) spesso vengono visualizzati come barrato. [3] [4] it.wikipedia.org/wiki/Strikethrough Anche se non <del> non <strike> funziona per me
lxknvlk,

0

Nel tuo modello di vista osservabile

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
    }
}

quindi nel tuo XML

     <TextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         app:strike="@{itemViewModel.strikeContent}" />
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.