membuat teks dicoret?

128

Dapatkah saya membuat teks yang dicoret di Android, maksud saya menambahkan nilai khusus di TextViewtag yang memungkinkan ini terjadi?

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

Jawaban:

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

Untuk melukis teks, ada beberapa tanda bit untuk melakukan hal-hal seperti huruf tebal, miring, dan ya dicoret. Jadi untuk mengaktifkan coret, Anda perlu membalik bit yang sesuai dengan bendera ini. Cara termudah untuk melakukan ini adalah dengan menggunakan bitwise-atau pada flag saat ini dan konstanta yang berhubungan dengan satu set flag dengan hanya flag strikethrough yang diaktifkan.

Edit dari Komentar oleh Ε Г И І И О :

Untuk siapa pun yang ingin menghapus bendera ini, ini caranya:

someTextView.setPaintFlags(someTextView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
hovanessyan
sumber
2
itu benar-benar bekerja, tetapi dapatkah saya mengubah haknya maksud saya ukurannya, warnanya sesuatu seperti itu
nawfal cuteberg
122
Bagi siapa pun yang ingin menghapus bendera ini, ini adalah caranya:someTextView.setPaintFlags(someTextView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
Ε Г И І И О
1
@ ΕГИІИО apa arti simbol ~?
Mathieu Castets
2
@ BobbyJackson, itu adalah operator komplemen bitwise unary.
Ε Г И І И О
3
@ ΕГИІИО mengembalikan semua bit. jadi katakanlah strike_thru adalah 00100, maka ~ tidak 11011. Jika Anda kemudian & dengan bendera yang ada, itu akan menjaga semua bendera asli tetapi tidak mengatur bit strike_thru
Boy
32

Sangat mudah jika Anda menggunakan string:

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

Dan kemudian:

<TextView 
        ...
         android:text="@string/line"
 />
Ignacio Alorre
sumber
ini tidak ditampilkan sebagai dicoret di editor ui, tetapi hal itu menyerang teks pada perangkat
yarell
1
Ini mungkin (dan kemungkinan akan) gagal di API 21+
Martin Marconcini
Jawaban ini sudah 3 tahun. Saya tidak yakin apakah perlu mengedit jawaban yang menjelaskan sampai API atau versi apa yang berguna. Jika ada aturan dalam stackoverflow yang setidaknya merekomendasikannya, saya akan melakukannya tanpa masalah.
Ignacio Alorre
3
Ini berfungsi di setiap level API yang telah saya uji (diuji pada 15, 25, dan 27)
Randy
Beberapa perangkat tidak menghormati hal-hal seperti ini atau yang digarisbawahi
James Riordan
26

Jika Anda menggunakan Kotlin:

your_text_view.apply {
    paintFlags = paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
    text = "Striked thru text"
}
bko
sumber
5
Dan untuk membatalkannya:paintFlags = paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
Kembalikan
25

Anda dapat melakukan ini dalam tiga cara, dengan menetapkan latar depan TextViewatau pengaturan PaintFlagatau mendeklarasikan string seperti <strike>your_string</strike>pada strings.xml. Sebagai contoh,

Melalui PaintFlag

Ini adalah metode paling sederhana Anda hanya perlu mengatur bendera dicoret pada TextView Anda sebagai,

yourTextView.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG);

itu akan menembus TextView Anda.

Melalui draw foreground (Hanya berfungsi untuk API 23+)

Jika minSdkVersion Anda adalah API versi 23 +, maka Anda dapat menelusuri TextView Anda dengan menetapkan latar depan sebagai,

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

Sekarang, Anda hanya perlu mengatur drawable di atas di TextView sebagai foreground. Sebagai contoh,

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

Melalui strings.xml

Dalam metode ini, Anda harus mendeklarasikan string Anda strings.xmlsebagai pemogokan,

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

Catatan

Tapi saya sarankan Anda untuk menelusuri TextView Anda dengan mengatur foreground drawable. Karena melalui drawable Anda dapat dengan mudah mengatur warna garis strike-through (seperti yang saya tetapkan sebagai warna merah pada contoh di atas) atau ukuran atau properti gaya lainnya. Sedangkan dalam dua metode lainnya, warna teks standar adalah warna coret.

Aditya S.
sumber
19

coba ini :

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
sumber
14

Saya hanya menyalin jawaban saya . Semoga ini bisa membantu seseorang. Jika Anda memiliki satu kata, kami dapat menggunakan drawable. Berikut ini adalah contohnya:

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

jika Anda memiliki banyak baris, Anda dapat menggunakan kode berikut:

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

Cukup gunakan ini dan Anda selesai. Untuk Aktivitas:

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

Untuk 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
sumber
Solusi
cerdas
Tetapi XMLsolusi ini tidak terlalu rumit, maksud saya untuk setiap tampilan teks Anda harus menambahkan tata letak relatif tambahan dan tampilan.
Aditya S.
Untuk saat ini, saya hanya memiliki solusi ini, jika saya mendapatkan solusi lain. Saya harus berbagi dengan Anda.
Hanisha
6

Ini cocok dengan penyatuan data:

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

Kemudian di xml Anda:

    <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
sumber
3

Saya mencoba beberapa opsi di atas tetapi, ini bekerja paling baik untuk saya:

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

Bersulang

Milos Simic Simo
sumber
Elemen inline presentasi HTML untuk dicoret adalah <strike> atau <s> Elemen ini, bagaimanapun, sudah usang dalam standar HTML 4.01 1999, dan digantikan oleh tag <del>, elemen semantik yang mewakili teks yang dihapus, yang digunakan oleh agen pengguna (biasanya agen pengguna (biasanya browser web) sering ditampilkan sebagai coretan. [3] [4] en.wikipedia.org/wiki/Strikethrough Meskipun tidak <del> tidak <strike> bekerja untuk saya
lxknvlk
0

Dalam model tampilan yang dapat diamati

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

lalu di xml Anda

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