tworzysz przekreślony tekst?

128

Czy mogę utworzyć przekreślony tekst w Androidzie, mam na myśli dodanie specjalnej wartości w TextViewtagu, która może to umożliwić?

<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
źródło

Odpowiedzi:

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

W przypadku malowania tekstu istnieje kilka flag bitowych do wykonywania takich rzeczy, jak pogrubienie, kursywa i przekreślenie tak. Aby włączyć przekreślenie, musisz odwrócić bit, który odpowiada tej fladze. Najłatwiejszym sposobem na to jest użycie flagi bitowej lub na bieżących flagach i stałej, która odpowiada zestawowi flag z włączoną tylko flagą przekreślenia.

Edytuj z komentarza autorstwa Ε Г И І И О :

Dla każdego, kto chce usunąć tę flagę, oto jak:

someTextView.setPaintFlags(someTextView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
hovanessyan
źródło
2
to naprawdę działa, ale czy mogę zmienić jego właściwości, mam na myśli jego rozmiar, jego kolor coś takiego
nawfal cuteberg
122
Dla każdego, kto chce usunąć tę flagę, oto jak:someTextView.setPaintFlags(someTextView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
Ε Г И І И О
1
@ ΕГИІИО co oznacza symbol ~?
Mathieu Castets
2
@BobbyJackson, czyli jednoargumentowy operator dopełniacza bitowego.
Ε Г И І И О
3
@ ΕГИІИО odwraca wszystkie bity. więc powiedzmy, że strike_thru to 00100, a następnie ~ robi 11011. Jeśli wtedy i to z istniejącymi flagami, to zachowa wszystkie oryginalne flagi, ale wyłączy bit strike_thru
Boy
32

Jest to naprawdę proste, jeśli używasz ciągów:

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

A potem tylko:

<TextView 
        ...
         android:text="@string/line"
 />
Ignacio Alorre
źródło
to nie jest wyświetlane jako przekreślenie w edytorze interfejsu użytkownika, ale uderza w tekst na urządzeniu
yarell
1
Może to (i prawdopodobnie się nie powiedzie) w API 21+
Martin Marconcini,
Ta odpowiedź ma 3 lata. Nie jestem pewien, czy konieczne jest edytowanie odpowiedzi wyjaśniających, do czasu kiedy API lub wersja są przydatne. Jeśli jest jakaś reguła w stackoverflow, która przynajmniej to zalecała, zrobię to bez problemów.
Ignacio Alorre,
3
To działało na każdym poziomie API, na którym testowałem (testowano 15, 25 i 27)
Randy
Niektóre urządzenia nie honorują takich rzeczy ani podkreślenia
James Riordan
26

Jeśli używasz Kotlin:

your_text_view.apply {
    paintFlags = paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
    text = "Striked thru text"
}
bko
źródło
5
Aby to cofnąć:paintFlags = paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
Cofnij
25

Możesz to zrobić na trzy sposoby, ustawiając pierwszy plan w TextViewlub ustawiając PaintFlaglub deklarując ciąg jako <strike>your_string</strike>w strings.xml. Na przykład,

Poprzez PaintFlag

To jest najprostsza metoda, którą wystarczy ustawić flagę przekreślenia w TextView jako,

yourTextView.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG);

przejdzie przez Twój TextView.

Do rysowania na pierwszym planie (działa tylko dla API 23+)

Jeśli Twoja minSdkVersion to API w wersji 23 +, możesz przekreślić TextView, ustawiając pierwszy plan jako,

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

Teraz musisz po prostu ustawić powyżej możliwość rysowania w swoim TextView jako foreground. Na przykład,

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

Poprzez strings.xml

W tej metodzie musisz zadeklarować swój ciąg strings.xmljako przekreślony jako,

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

Uwaga

Ale polecam przekreślić TextView, ustawiając możliwość rysowania pierwszego planu. Ponieważ poprzez rysowanie możesz łatwo ustawić kolor przekreślonej linii (tak jak ustawiłem jako kolor czerwony w powyższym przykładzie), rozmiar lub inną właściwość stylu. Podczas gdy w pozostałych dwóch metodach domyślnym kolorem tekstu jest kolor przekreślony.

Aditya S.
źródło
19

Spróbuj tego :

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
źródło
14

Po prostu kopiuję swoją odpowiedź . Mam nadzieję, że to pomoże komuś Jeśli masz jedno słowo, możemy użyć rysowalnego. Oto przykład:

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

jeśli masz wiele linii, możesz użyć następującego kodu:

TextView someTextView = (TextView) findViewById(R.id.some_text_view);
someTextView.setText(someString);
someTextView.setPaintFlags(someTextView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG)
Akshay Mukadam
źródło
8

Po prostu użyj tego i gotowe. Do aktywności:

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

W przypadku 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
źródło
Genialne rozwiązanie
Nishant Shah
Ale to XMLrozwiązanie nie jest zbyt skomplikowane, mam na myśli, że do każdego widoku tekstu musisz dodać dodatkowy układ względny i widok.
Aditya S.,
Na razie mam tylko to rozwiązanie, jeśli dostanę inne rozwiązanie. Muszę się z tobą podzielić.
Hanisha,
6

To dobrze pasuje do wiązania danych:

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

Następnie w swoim 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
źródło
3

Wypróbowałem kilka opcji powyżej, ale to działa najlepiej dla mnie:

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

Twoje zdrowie

Milos Simic Simo
źródło
Wbudowany element prezentacji HTML dla przekreślenia to <strike> lub <s>. Ten element został jednak wycofany w standardzie HTML 4.01 z 1999 r. I zastąpiony znacznikiem <del>, semantycznym elementem reprezentującym usunięty tekst, którego programy użytkownika (zazwyczaj przeglądarki internetowe) często są renderowane jako przekreślenie. [3] [4] en.wikipedia.org/wiki/Strikethrough Chociaż nie <del>, nie <strike> działa dla mnie
lxknvlk
0

W Twoim modelu obserwowalnego widoku

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

następnie w swoim xml

     <TextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         app:strike="@{itemViewModel.strikeContent}" />
ajaykoppisetty
źródło