【问题标题】:creating a strikethrough text?创建删除线文本?
【发布时间】:2012-03-20 12:14:56
【问题描述】:

我可以在 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"/>

【问题讨论】:

标签: android user-interface


【解决方案1】:

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

对于绘制文本,有几个位标志用于执行以下操作 粗体,斜体,是删除线。所以要启用删除线, 您需要翻转与此标志对应的位。最简单的 这样做的方法是在当前标志上使用按位或 对应于一组标志的常量,只有 删除线标志已启用。

CommentΕ Г И І И О 编辑:

对于任何想要删除此标志的人,方法如下:

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

【讨论】:

  • 它确实有效,但我可以改变它的属性,我的意思是它的大小,它的颜色类似
  • 对于任何想要删除此标志的人,方法如下:someTextView.setPaintFlags(someTextView.getPaintFlags() &amp; (~Paint.STRIKE_THRU_TEXT_FLAG));
  • @ΕГИІИО ~ 符号是什么意思?
  • @BobbyJackson,这是一元按位补码运算符。
  • @ΕГИІИО 它会还原所有位。所以假设strike_thru 是00100,然后~ 是11011。如果你用现有的标志然后& 它,它将保留所有原始标志但取消设置strike_thru 位
【解决方案2】:

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

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

然后就是:

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

【讨论】:

  • 这在 ui 编辑器中没有显示为删除线,但它确实删除了设备上的文本
  • 这可能(并且很可能会)在 API 21+ 中失败
  • 这个答案有 3 年。我不确定是否有必要编辑解释解释的答案,直到什么 API 或版本有用为止。如果stackoverflow中有任何规则至少推荐它,我会毫无问题地做到这一点。
  • 这适用于我测试过的每个 API 级别(在 15、25 和 27 上测试)
  • 有些设备不支持这样的东西或下划线
【解决方案3】:

如果您使用的是 Kotlin:

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

【讨论】:

  • 撤消它:paintFlags = paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
【解决方案4】:

您可以通过三种方式执行此操作,通过在TextView 中设置前景或在strings.xml 中设置PaintFlag 或将字符串声明为&lt;strike&gt;your_string&lt;/strike&gt;。例如,

通过 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。因为通过drawable,您可以轻松设置删除线颜色(就像我在上面的示例中设置为红色一样)或大小或任何其他样式属性。而在其他两种方法中,默认文本颜色是删除线颜色。

【讨论】:

    【解决方案5】:

    试试这个:

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

    【讨论】:

      【解决方案6】:

      我只是在复制我的answer。希望它对某人有帮助 如果你有一个单词,我们可以使用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)
      

      【讨论】:

        【解决方案7】:

        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
        

        并使用:

        textView.strike = true
        

        【讨论】:

          【解决方案8】:

          这非常适合数据绑定:

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

          【讨论】:

            【解决方案9】:

            只需使用它,你就完成了。 对于活动:

            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>
            

            【讨论】:

            • 巧妙的解决方案
            • 但是这个XML 解决方案并不太复杂,我的意思是对于每个文本视图,您必须添加额外的相对布局和视图。
            • 现在,我只有这个解决方案,如果我得到另一个解决方案。我必须与你分享。
            【解决方案10】:

            在 kotlin 中:

            要做的事情:

            textView.paintFlags= textView.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
            

            撤消:

            textView.paintFlags= textView.paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
            

            【讨论】:

              【解决方案11】:

              我尝试了上面的几个选项,但是这对我来说最有效:

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

              干杯

              【讨论】:

              • 用于删除线的 HTML 表示内联元素是 但是,该元素在 1999 HTML 4.01 标准中已弃用,并由 标记代替,该标记表示删除的文本,用户代理(通常是 Web 浏览器)通常将其呈现为删除线。[3][4] en.wikipedia.org/wiki/Strikethrough 虽然不是 不是 适合我
              【解决方案12】:

              正如 alejandro-h-cruz 所建议的,这是 Kotlin 扩展函数来帮助这样做。

                  private fun TextView.strikeThrough(shouldStrike: Boolean) {
                      paintFlags = if (shouldStrike) {
                          paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
                      } else {
                          paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
                      }
                  }
              

              【讨论】:

                【解决方案13】:

                在您的可观察视图模型中

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-03-24
                  • 2012-01-29
                  • 1970-01-01
                  相关资源
                  最近更新 更多