สร้างข้อความขีดทับ?


128

ฉันสามารถสร้างข้อความขีดทับใน Android ได้หรือไม่ฉันหมายถึงการเพิ่มค่าพิเศษในTextViewแท็กที่ทำให้สิ่งนี้เป็นไปได้

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


ตรวจสอบที่นี่ stackoverflow.com/a/45186622/835883
j2emanue

คำตอบ:


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

สำหรับการระบายสีข้อความมีแฟล็กบิตหลายแบบสำหรับการทำสิ่งต่างๆเช่นตัวหนาตัวเอียงและใช่ขีดทับ ดังนั้นในการเปิดใช้งานขีดฆ่าคุณต้องพลิกบิตที่ตรงกับแฟล็กนี้ วิธีที่ง่ายที่สุดในการทำเช่นนี้คือการใช้แฟล็กแบบบิตหรือบนแฟล็กปัจจุบันและค่าคงที่ที่สอดคล้องกับชุดของแฟล็กที่เปิดใช้งานเฉพาะแฟล็ก Strikethrough

แก้ไขจากความคิดเห็นโดยΕГИІИО :

สำหรับใครก็ตามที่ต้องการลบแฟล็กนี้ให้ทำดังนี้:

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

2
มันใช้งานได้จริง แต่ฉันสามารถเปลี่ยนความเหมาะสมได้หรือไม่ฉันหมายถึงขนาดของมันสีของมันประมาณนั้น
nawfal cuteberg

122
สำหรับผู้ที่ต้องการลบแฟล็กนี้ต้องทำดังนี้:someTextView.setPaintFlags(someTextView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
ΕГИІИО

1
@ ΕГИІИОสัญลักษณ์ ~ หมายถึงอะไร?
Mathieu Castets

2
@BobbyJackson นั่นคือโอเปอเรเตอร์ส่วนเสริมที่ไม่ถูกต้องในระดับบิต
ΕГИІИО

3
@ ΕГИІИОมันจะย้อนกลับบิตทั้งหมด สมมติว่า strike_thru คือ 00100 แล้ว ~ ทำ 11011 ถ้าคุณและด้วยแฟล็กที่มีอยู่มันจะเก็บแฟล็กดั้งเดิมทั้งหมดไว้ แต่ยกเลิกการตั้งค่าบิต strike_thru
Boy

32

มันง่ายมากถ้าคุณใช้สตริง:

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

จากนั้นเพียงแค่:

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

สิ่งนี้ไม่ได้แสดงเป็นขีดทับในตัวแก้ไข UI แต่มันขีดทับข้อความบนอุปกรณ์
yarell

1
สิ่งนี้อาจ (และมีแนวโน้มว่าจะ) ล้มเหลวใน API 21+
Martin Marconcini

คำตอบนี้มีเวลา 3 ปี ฉันไม่แน่ใจว่าจำเป็นต้องแก้ไขคำตอบเพื่ออธิบายจนกว่า API หรือเวอร์ชันใดจะมีประโยชน์ หากมีกฎใด ๆ ใน stackoverflow ซึ่งอย่างน้อยก็ recommed ฉันจะทำโดยไม่มีปัญหา
Ignacio Alorre

3
สิ่งนี้ใช้ได้ในทุกระดับ API ที่ฉันได้ทดสอบ (ทดสอบเมื่อ 15, 25 และ 27)
Randy

อุปกรณ์บางอย่างไม่ให้เกียรติสิ่งนี้หรือขีดเส้นใต้
James Riordan

26

หากคุณกำลังใช้ Kotlin:

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

5
และในการเลิกทำ:paintFlags = paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
reVerse

25

คุณสามารถทำได้สามวิธีโดยการตั้งค่าเบื้องหน้าในTextViewหรือการตั้งค่าPaintFlagหรือการประกาศสตริงเป็น<strike>your_string</strike>ในstrings.xmlในตัวอย่างเช่น,

ผ่าน PaintFlag

นี่เป็นวิธีที่ง่ายที่สุดที่คุณต้องตั้งค่าสถานะขีดทับบน TextView ของคุณเป็น

yourTextView.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG);

มันจะโจมตีผ่าน TextView ของคุณ

ผ่านโฟร์กราวด์ที่วาดได้ (ใช้ได้กับ API 23+ เท่านั้น)

หาก minSdkVersion ของคุณเป็น API เวอร์ชัน 23 + คุณสามารถขีดฆ่าผ่าน TextView ของคุณโดยตั้งค่าพื้นหน้าเป็น

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

ตอนนี้คุณต้องตั้งค่าด้านบนที่วาดได้ใน TextView ของคุณเป็นforegroundไฟล์. ตัวอย่างเช่น,

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

ผ่าน strings.xml

ในวิธีนี้คุณต้องประกาศสตริงของคุณstrings.xmlเป็นขีดฆ่า

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

บันทึก

แต่ฉันขอแนะนำให้คุณโจมตีผ่าน TextView ของคุณโดยการตั้งค่าเบื้องหน้าที่วาดได้ เนื่องจากสามารถวาดได้คุณสามารถกำหนดสีเส้นขีดฆ่าของคุณได้อย่างง่ายดาย (เช่นฉันกำหนดเป็นสีแดงในตัวอย่างด้านบน) หรือขนาดหรือคุณสมบัติรูปแบบอื่น ๆ ในขณะที่อีกสองวิธีสีข้อความเริ่มต้นคือสีขีดทับ


19

ลองสิ่งนี้:

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

ฉันเพียงแค่คัดลอกของฉันคำตอบ หวังว่ามันจะช่วยสำหรับใครบางคนหากคุณมีคำเดียวเราสามารถใช้วาดได้ ต่อไปนี้เป็นตัวอย่าง:

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

หากคุณมีหลายบรรทัดคุณสามารถใช้รหัสต่อไปนี้:

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

8

เพียงแค่ใช้สิ่งนี้และคุณจะเสร็จสิ้น สำหรับกิจกรรม:

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

สำหรับ 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>

วิธีแก้ปัญหาที่ชาญฉลาด
Nishant Shah

แต่XMLโซลูชันนี้ไม่ซับซ้อนมากเกินไปฉันหมายถึงทุก textview คุณต้องเพิ่มเค้าโครงสัมพัทธ์เพิ่มเติมและมุมมอง
Aditya S.

ตอนนี้ฉันมีวิธีแก้ปัญหานี้เท่านั้นถ้าฉันได้รับโซลูชันอื่น ฉันต้องแบ่งปันกับคุณ
Hanisha

6

สิ่งนี้เข้ากันได้ดีกับ databinding:

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

จากนั้นใน 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

ฉันลองไม่กี่ตัวเลือกข้างต้น แต่วิธีนี้ได้ผลดีที่สุดสำหรับฉัน:

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

ไชโย


องค์ประกอบอินไลน์ในการนำเสนอ HTML สำหรับการขีดทับคือ <strike> หรือ <s> องค์ประกอบนี้เลิกใช้แล้วในมาตรฐาน 1999 HTML 4.01 และแทนที่ด้วยแท็ก <del> ซึ่งเป็นองค์ประกอบความหมายที่แสดงข้อความที่ถูกลบซึ่งตัวแทนผู้ใช้ (โดยทั่วไป เว็บเบราว์เซอร์) มักจะแสดงเป็นขีดทับ [3] [4] en.wikipedia.org/wiki/Strikethrough แม้ว่าจะไม่ <del> ไม่ <strike> ใช้ได้กับฉัน
ก็ตาม

0

ในโมเดลมุมมองที่สังเกตได้ของคุณ

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

จากนั้นใน xml ของคุณ

     <TextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         app:strike="@{itemViewModel.strikeContent}" />
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.