criando um texto tachado?

128

Posso criar um texto tachado no Android, ou seja, adicionar um valor especial na TextViewtag que torne isso possível?

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

Respostas:

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

Para pintar texto, existem vários sinalizadores de bits para fazer coisas como negrito, itálico e tachado sim. Portanto, para ativar a tacada, você precisa inverter o bit que corresponde a esse sinalizador. A maneira mais fácil de fazer isso é usar um sinalizador bit a bit ou atual e uma constante que corresponda a um conjunto de sinalizadores com apenas o sinalizador tachado ativado.

Editar do comentário por Ε Г И І О О :

Para quem deseja remover esse sinalizador, é assim:

someTextView.setPaintFlags(someTextView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
hovanessyan
fonte
2
ele realmente funciona, mas eu posso mudar seus properities eu quero dizer o seu tamanho, sua cor algo parecido
Nawfal cuteberg
122
Para qualquer pessoa que queira remover esse sinalizador, é assim:someTextView.setPaintFlags(someTextView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
Ε Г И О О
1
@ O que significa o símbolo ~?
Mathieu Castets
2
@BobbyJackson, esse é o operador de complemento bit a bit unário.
Ε Г И І И О
3
@ Reverte todos os bits. então vamos dizer strike_thru é 00100, então ~ faz 11011. Se você, em seguida, e com as bandeiras existentes, ele irá manter todas as bandeiras originais, mas retirar a pouco strike_thru
Boy
32

É realmente fácil se você estiver usando strings:

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

E então apenas:

<TextView 
        ...
         android:text="@string/line"
 />
Ignacio Alorre
fonte
isso não mostrar como tachado no editor ui, mas não atacar o texto no dispositivo
yarell
1
Isso pode (e provavelmente irá) falhar na API 21+
Martin Marconcini
Esta resposta tem 3 anos. Não tenho certeza se é necessário editar respostas explicando até que API ou versão são úteis. Se houver alguma regra no stackoverflow que pelo menos a recomende, farei isso sem problemas.
Ignacio Alorre 25/08
3
Isso funcionou em todos os níveis API que eu tenho testado em (testado em 15, 25 e 27)
Randy
Alguns dispositivos não respeitam coisas como esta ou o sublinhado
James Riordan
26

Se você estiver usando o Kotlin:

your_text_view.apply {
    paintFlags = paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
    text = "Striked thru text"
}
bko
fonte
5
E para desfazê-lo:paintFlags = paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
reverter
25

Você pode fazer isso de três maneiras, definindo o primeiro plano TextViewou definindo PaintFlagou declarando uma sequência como <strike>your_string</strike>em strings.xml. Por exemplo,

Através do PaintFlag

Esse é o método mais simples, basta definir o sinalizador tachado no TextView como,

yourTextView.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG);

ele atingirá seu TextView.

Através do primeiro plano extraível (funciona apenas para API 23+)

Se sua minSdkVersion for a versão 23+ da API, você poderá percorrer seu TextView definindo um primeiro plano como,

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

Agora, basta definir o drawable acima no TextView como foreground. Por exemplo,

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

Através de strings.xml

Nesse método, você deve declarar sua cadeia de caracteres strings.xmlcom o máximo de

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

Nota

Mas eu recomendo que você percorra seu TextView definindo drawable em primeiro plano. Como através do drawable, você pode definir facilmente a cor da linha de passagem (como eu defini como cor vermelha no exemplo acima) ou tamanho ou qualquer outra propriedade de estilo. Enquanto nos outros dois métodos, a cor de texto padrão é a cor tachada.

Aditya S.
fonte
19

tente isto:

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); 
Coleção K
fonte
14

Estou apenas copiando minha resposta . Espero que ajude alguém Se você tiver uma única palavra, podemos usar o drawable. A seguir está o exemplo:

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

se você tiver várias linhas, poderá usar o seguinte código:

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

Basta usar isso e pronto. Para atividade:

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

Para 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
fonte
Solução engenhosa
Nishant Shah
Mas essa XMLsolução não é muito complexa, quero dizer que para cada visualização de texto você deve adicionar um layout e uma visualização relativos adicionais.
Aditya S.
Por enquanto, só tenho essa solução, se tiver outra solução. Eu devo compartilhar com você.
Hanisha
6

Isso se encaixa perfeitamente na ligação de dados:

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

Então no seu 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
fonte
3

Eu tentei algumas opções acima, mas isso funciona melhor para mim:

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

Felicidades

Milos Simic Simo
fonte
O elemento embutido de apresentação HTML para tachado é <strike> ou <s>. No entanto, esse elemento foi preterido no padrão HTML 4.01 de 1999 e substituído pela tag <del>, um elemento semântico que representa o texto excluído, que os agentes do usuário (normalmente navegadores da web) geralmente são renderizados como tachados. [3] [4] en.wikipedia.org/wiki/Strikethrough Embora não seja <del> não <strike> funciona para mim
lxknvlk
0

No seu modelo de vista observável

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

então no seu xml

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