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"/>
Nawfal Cuteberg
quelle

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));
hovanessyan
quelle
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"
 />
Ignacio Alorre
quelle
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"
}
bko
quelle
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.

Aditya S.
quelle
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); 
ρяσssρєя K.
quelle
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)
Akshay Mukadam
quelle
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>
Hanisha
quelle
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}"/>
Daniel Wilson
quelle
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

Milos Simic Simo
quelle
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}" />
ajaykoppisetty
quelle