创建删除线文本?

naw*_*erg 112 user-interface android

我可以在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"/>
Run Code Online (Sandbox Code Playgroud)

hov*_*yan 284

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);
Run Code Online (Sandbox Code Playgroud)

对于绘制文本,有一些位标志用于执行粗体,斜体和是删除线等操作.因此,要启用删除线,您需要翻转与此标志对应的位.最简单的方法是使用按位或当前标志和一个常量,该常量对应于只启用了删除标记的一组标志.

  • 对于任何想要删除此标志的人,这是如下:`someTextView.setPaintFlags(someTextView.getPaintFlags()&(~Paint.STRIKE_THRU_TEXT_FLAG));` (113认同)
  • 它确实有效,但我可以改变它的特性吗?我的意思是它的大小,它的颜色之类的 (3认同)
  • @ΕГИІИО 它会还原所有位。所以让我们说strike_thru是00100,然后~是11011。如果你然后&amp;它与现有标志,它将保留所有原始标志但取消strike_thru位 (3认同)
  • @BobbyJackson,这是一元按位补码运算符。 (2认同)

Ign*_*rre 26

如果你使用字符串真的很容易:

<string name="line"> Not crossed <strike> crossed </strike> </string>
Run Code Online (Sandbox Code Playgroud)

然后就是:

<TextView 
        ...
         android:text="@string/line"
 />
Run Code Online (Sandbox Code Playgroud)

  • 这适用于我测试过的每个 API 级别(在 15、25 和 27 上测试) (3认同)

ρяσ*_*я K 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); 
Run Code Online (Sandbox Code Playgroud)


Aks*_*dam 14

我只是在复制我的答案.希望它对某人有所帮助如果你有一个单词,我们可以使用drawable.以下是示例:

<item android:state_pressed="false"><shape android:shape="line">
        <stroke android:width="2dp" android:color="#ffffff" />
    </shape>
</item>
Run Code Online (Sandbox Code Playgroud)

如果您有多行,则可以使用以下代码:

TextView someTextView = (TextView) findViewById(R.id.some_text_view);
someTextView.setText(someString);
someTextView.setPaintFlags(someTextView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG)
Run Code Online (Sandbox Code Playgroud)


Hei*_*erg 14

您可以通过三种方式做到这一点,在任何设置前景色TextView,或置PaintFlag或声明字符串<strike>your_string</strike>strings.xml.例如,

通过PaintFlag

这是最简单的方法,你只需要在TextView上设置删除线标志,

yourTextView.setPaintFlags(Paint.STRIKE_THRU_TEXT_FLAG);
Run Code Online (Sandbox Code Playgroud)

它将通过您的TextView进行攻击.

通过前景绘制

你也可以通过设置前景来浏览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>
Run Code Online (Sandbox Code Playgroud)

现在,您只需在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 --!>
Run Code Online (Sandbox Code Playgroud)

通过strings.xml

在这种方法中,你必须将你的字符串声明strings.xml为穿透,因为,

<string name="strike_line"> <strike>This line is strike throughed</strike></string>
Run Code Online (Sandbox Code Playgroud)

注意

但我建议你通过设置前景drawable来浏览TextView.因为通过drawable你可以很容易地通过线条颜色设置你的打击(就像我在上面的例子中设置为红色)或大小或任何其他样式属性.而在其他两种方法中,默认的textcolor是通过颜色进行的.


bko*_*bko 12

如果您使用的是Kotlin:

your_text_view.apply {
    paintFlags = paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
    text = "Striked thru text"
}
Run Code Online (Sandbox Code Playgroud)

  • 并撤消它:`paintFlags = paintFlags和Paint.STRIKE_THRU_TEXT_FLAG.inv()` (2认同)

Yel*_*sov 10

Kotlin 中,您可以创建扩展属性:

inline var TextView.strike: Boolean
    set(visible) {
        paintFlags = if (visible) paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
        else paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
    }
    get() = paintFlags and Paint.STRIKE_THRU_TEXT_FLAG == Paint.STRIKE_THRU_TEXT_FLAG
Run Code Online (Sandbox Code Playgroud)

并使用:

textView.strike = true
Run Code Online (Sandbox Code Playgroud)


Dan*_*son 9

这非常适合数据绑定:

@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()
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在你的 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}"/>
Run Code Online (Sandbox Code Playgroud)


小智 7

只需使用它就可以了.对于活动:

TextView t= (TextView).findViewById(R.id.thousand));
t.setPaintFlags(t.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
Run Code Online (Sandbox Code Playgroud)

对于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>
Run Code Online (Sandbox Code Playgroud)


Ras*_*sel 5

在科特林中:

去做:

textView.paintFlags= textView.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
Run Code Online (Sandbox Code Playgroud)

撤销:

textView.paintFlags= textView.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
Run Code Online (Sandbox Code Playgroud)