tạo ra một văn bản gạch ngang?


128

Tôi có thể tạo một văn bản gạch ngang trong Android không, ý tôi là thêm một giá trị đặc biệt vào TextViewthẻ có thể thực hiện điều này?

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



Câu trả lời:


311

Sơn.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);

Để vẽ văn bản, có một số cờ bit để thực hiện những việc như in đậm, in nghiêng và vâng vâng. Vì vậy, để kích hoạt đường chuyền, bạn cần lật bit tương ứng với cờ này. Cách dễ nhất để làm điều này là sử dụng bitwise - hoặc trên các cờ hiện tại và hằng số tương ứng với một bộ cờ chỉ có cờ gạch ngang được kích hoạt.

Chỉnh sửa từ Nhận xét bởi Ε é :

Đối với bất kỳ ai muốn xóa cờ này, đây là cách:

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

2
nó thực sự hoạt động, nhưng tôi có thể thay đổi sự phù hợp của nó không, ý tôi là kích thước của nó, màu sắc của nó giống như thế
nawfal cuteberg 20/03/2016

122
Đối với bất kỳ ai muốn xóa cờ này, đây là cách:someTextView.setPaintFlags(someTextView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
Г é І И И

1
@ ΕΕИІИИІИ Biểu tượng ~ có nghĩa là gì?
Mathieu Castets

2
@BulkJackson, đó là toán tử bổ sung bitwise unary.
Ε é И,

3
@ ΕΕИІИИІИ nó hoàn nguyên tất cả các bit. vì vậy, giả sử strike_thru là 00100, sau đó ~ 11011. Nếu bạn và nó với các cờ hiện có, nó sẽ giữ tất cả các cờ ban đầu nhưng bỏ đặt bit strike_thru
Boy

32

Nó thực sự dễ dàng nếu bạn đang sử dụng chuỗi:

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

Và sau đó chỉ:

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

điều này không thể hiện như một cuộc đình công trong trình soạn thảo ui, nhưng nó tấn công văn bản trên thiết bị
yarell

1
Điều này có thể (và có thể sẽ) thất bại trong API 21+
Martin Marconcini

Câu trả lời này có 3 năm. Tôi không chắc có cần chỉnh sửa câu trả lời giải thích cho đến khi API hoặc phiên bản nào hữu ích không. Nếu có bất kỳ quy tắc nào trong stackoverflow mà ít nhất là khuyến nghị, tôi sẽ thực hiện nó mà không gặp vấn đề gì.
Ignacio Alorre

3
Điều này hoạt động ở mọi cấp độ API mà tôi đã thử nghiệm (đã thử nghiệm vào ngày 15, 25 và 27)
Randy

Một số thiết bị không tôn trọng những thứ như thế này hoặc phần gạch chân
James Riordan

26

Nếu bạn đang sử dụng Kotlin:

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

5
Và để hoàn tác nó:paintFlags = paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
Xác minh lại

25

Bạn có thể làm điều này theo ba cách, bằng cách đặt tiền cảnh vào TextViewhoặc cài đặt PaintFlaghoặc khai báo một chuỗi như <strike>your_string</strike>trong strings.xml. Ví dụ,

Thông qua PaintFlag

Đây là phương pháp đơn giản nhất bạn chỉ cần đặt cờ gạch ngang trên TextView là,

yourTextView.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG);

nó sẽ tấn công qua TextView của bạn.

Thông qua foreground drawable (Chỉ hoạt động cho API 23+)

Nếu minSdkVersion của bạn là API phiên bản 23 +, thì bạn có thể tấn công TextView của mình bằng cách đặt tiền cảnh là,

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

Bây giờ, bạn chỉ cần đặt ở trên drawable trong TextView của bạn là foreground. Ví dụ,

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

Thông qua chuỗi

Trong phương thức này, bạn phải khai báo chuỗi của bạn strings.xmldưới dạng tấn công qua,

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

Ghi chú

Nhưng tôi khuyên bạn nên vượt qua TextView của mình bằng cách đặt foreground drawable. Bởi vì thông qua drawable, bạn có thể dễ dàng thiết lập màu đường kẻ sọc (như tôi đặt màu đỏ trong ví dụ trên) hoặc kích thước hoặc bất kỳ thuộc tính kiểu nào khác. Trong khi trong hai phương pháp khác, màu văn bản mặc định là màu gạch ngang.


19

thử cái này :

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

Tôi chỉ sao chép câu trả lời của tôi . Hy vọng nó sẽ giúp ích cho ai đó Nếu bạn có một từ duy nhất, chúng tôi có thể sử dụng drawable. Sau đây là ví dụ:

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

nếu bạn có nhiều dòng bạn có thể sử dụng đoạn mã sau:

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

8

Chỉ cần sử dụng này và bạn đã hoàn tất. Đối với hoạt động:

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

Đối với 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>

Giải pháp khéo léo
Nishant Shah

Nhưng XMLgiải pháp này không quá phức tạp, ý tôi là đối với mỗi lần xem văn bản, bạn phải thêm bố cục tương đối và chế độ xem.
Aditya S.

Bây giờ, tôi chỉ có giải pháp này, nếu tôi nhận được một giải pháp khác. Tôi phải chia sẻ với bạn.
H Biếna

6

Điều này rất phù hợp với 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()
    }
}

Sau đó, trong xml của bạn:

    <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

Tôi đã thử một vài lựa chọn ở trên nhưng, cách này hiệu quả nhất với tôi:

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

chúc mừng


Tuy nhiên, phần tử nội tuyến trình bày HTML cho gạch ngang là <strike> hoặc <s> Phần tử này, tuy nhiên, không được dùng trong tiêu chuẩn HTML 4.01 1999 và được thay thế bằng thẻ <del>, một yếu tố ngữ nghĩa đại diện cho văn bản đã xóa, mà tác nhân người dùng (thường là trình duyệt web) thường hiển thị dưới dạng gạch ngang. [3] [4] vi.wikipedia.org/wiki/Strikethrough Mặc dù không <del> không <strike> hoạt động với tôi
lxknvlk

0

Trong mô hình xem có thể quan sát của bạn

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

sau đó trong xml của bạn

     <TextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         app:strike="@{itemViewModel.strikeContent}" />
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.