创建删除线文本?


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



Answers:


311

绘画。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);

对于绘画文字,有一些用于执行粗体,斜体和是删除线之类的标志。因此,要启用删除线,您需要翻转与此标志相对应的位。最简单的方法是在当前标志上使用按位或,并在仅启用删除线标志的情况下使用与一组标志相对应的常量。

ΕГИІИО的评论编辑:

对于任何想要删除此标志的人,这是如何进行的:

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

2
它确实有效,但是我可以更改其
属性吗?

122
对于任何一个想要删除此标志,这是怎么了:someTextView.setPaintFlags(someTextView.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
ΕГИІИО

1
@ΕГИІИО〜符号是什么意思?
Mathieu Castets 2013年

2
@BobbyJackson,这是一元按位补码运算符。
ΕГИІИО

3
@ΕГИІИО它还原所有位。因此,假设strike_thru为00100,然后〜为11011。如果然后将其与现有标志一起使用,它将保留所有原始标志,但未设置strike_thru位
男孩

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中有任何规则至少可以推荐它,我将毫无问题地做到这一点。
伊格纳西奥·阿罗尔

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 +,则可以通过将前景设置为“

<?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中将上述drawable设置为即可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

我只是复制我的答案。希望它对某人有帮助。如果您有一个字,我们可以使用drawable。以下是示例:

<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

这非常适合数据绑定:

@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}" />
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.