einen durchgestrichenen Text erstellen?


128

Kann ich in Android einen durchgestrichenen Text erstellen? Ich meine, dem TextViewTag einen besonderen Wert hinzuzufügen , der dies ermöglicht.

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



Antworten:


312

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

Zum Malen von Text gibt es mehrere Bit-Flags, mit denen Sie beispielsweise fett, kursiv und durchgestrichen ausführen können. Um das Durchstreichen zu aktivieren, müssen Sie das Bit, das diesem Flag entspricht, umdrehen. Der einfachste Weg, dies zu tun, besteht darin, ein bitweises oder für die aktuellen Flags und eine Konstante zu verwenden, die einer Reihe von Flags entspricht, bei denen nur das Strikethrough-Flag aktiviert ist.

Bearbeiten aus Kommentar von Ε Г И І І О :

Für jeden, der diese Flagge entfernen möchte, gilt Folgendes:

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

2
es funktioniert wirklich, aber kann ich seine Eigenschaften ändern, ich meine seine Größe, seine Farbe so etwas
nawfal cuteberg

122
Für jeden, der diese Flagge entfernen möchte, ist dies wie folgt:someTextView.setPaintFlags(someTextView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
О

1
@ ΕГИІИО was bedeutet das Symbol ~?
Mathieu Castets

2
@ BobbyJackson, das ist der unäre bitweise Komplementoperator.
Г И І І

3
@ ΕГИІИО es werden alle Bits zurückgesetzt. Nehmen wir also an, strike_thru ist 00100, dann ~ macht 11011. Wenn Sie dann & it mit den vorhandenen Flags, werden alle ursprünglichen Flags beibehalten, aber das Strike_thru-Bit deaktiviert
Boy

32

Es ist wirklich einfach, wenn Sie Zeichenfolgen verwenden:

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

Und dann einfach:

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

Dies wurde im UI-Editor nicht als durchgestrichen angezeigt, aber es trifft den Text auf dem Gerät
Yarell

1
Dies kann (und wird wahrscheinlich) in API 21+
Martin Marconcini

Diese Antwort hat 3 Jahre. Ich bin nicht sicher, ob es notwendig ist, Antworten zu bearbeiten, die erklären, bis welche API oder Version nützlich sind. Wenn es im Stackoverflow eine Regel gibt, die es zumindest empfohlen hat, werde ich es ohne Probleme tun.
Ignacio Alorre

3
Dies funktionierte in jeder API-Ebene, auf der ich getestet habe (getestet auf 15, 25 und 27)
Randy

Einige Geräte berücksichtigen solche Dinge oder die Unterstreichung nicht
James Riordan

26

Wenn Sie Kotlin verwenden:

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

5
Und um es rückgängig zu machen:paintFlags = paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
ReVerse

25

Sie können dies auf drei Arten tun, indem Sie entweder den Vordergrund in TextViewsetzen PaintFlagoder eine Zeichenfolge wie <strike>your_string</strike>in setzen oder deklarierenstrings.xml . Beispielsweise,

Durch PaintFlag

Dies ist die einfachste Methode, mit der Sie in Ihrer TextView lediglich das Durchgestrichene Flag setzen müssen:

yourTextView.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG);

Es wird durch Ihre Textansicht schlagen.

Durch den Vordergrund zeichnbar (funktioniert nur für API 23+)

Wenn Ihre minSdkVersion API-Version 23 + ist, können Sie durch Ihre TextView streichen, indem Sie einen Vordergrund wie folgt festlegen:

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

Jetzt müssen Sie nur noch oben in Ihrer Textansicht als zeichnen foreground. Beispielsweise,

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

Durch strings.xml

Bei dieser Methode müssen Sie Ihre Zeichenfolge strings.xmlals durchgestrichen wie deklarieren.

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

Hinweis

Ich empfehle Ihnen jedoch, durch Ihre Textansicht zu streichen, indem Sie den Vordergrund als zeichnbar festlegen. Denn durch Zeichnen können Sie ganz einfach die Farbe Ihrer durchgestrichenen Linie (wie im obigen Beispiel als rote Farbe festgelegt) oder die Größe oder eine andere Stileigenschaft festlegen. Während bei den beiden anderen Methoden die Standardtextfarbe durchgestrichen ist.


19

Versuche dies :

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

Ich kopiere nur meine Antwort . Hoffe, es wird jemandem helfen Wenn Sie ein einziges Wort haben, können wir Drawable verwenden. Es folgt das Beispiel:

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

Wenn Sie mehrere Zeilen haben, können Sie den folgenden Code verwenden:

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

8

Verwenden Sie dies einfach und Sie sind fertig. Für Aktivität:

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

Für 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>

Geniale Lösung
Nishant Shah

Diese XMLLösung ist jedoch nicht zu komplex. Ich meine, für jede Textansicht müssen Sie ein zusätzliches relatives Layout und eine Ansicht hinzufügen.
Aditya S.

Im Moment habe ich nur diese Lösung, wenn ich eine andere Lösung bekomme. Ich muss mit dir teilen.
Hanisha

6

Das passt gut in die Datenbindung:

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

Dann in Ihrer 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

Ich habe oben einige Optionen ausprobiert, aber das funktioniert am besten für mich:

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

Prost


Das HTML-Präsentations-Inline-Element für das Durchstreichen ist <strike> oder <s>. Dieses Element wurde jedoch im HTML 4.01-Standard von 1999 nicht mehr unterstützt und durch das <del> -Tag ersetzt, ein semantisches Element, das gelöschten Text darstellt, den Benutzer (normalerweise) verwenden Webbrowser) werden oft als durchgestrichen gerendert. [3] [4] en.wikipedia.org/wiki/Strikethrough Obwohl nicht <del> nicht <strike> für mich funktioniert
lxknvlk

0

In Ihrem beobachtbaren Ansichtsmodell

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

dann in deiner xml

     <TextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         app:strike="@{itemViewModel.strikeContent}" />
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.