152

我想知道是否有一种简单的方法可以在 Android 的应用小部件中删除文本。在正常活动中,使用 textview 标志非常简单:

textView.setPaintFlags(textView.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

但是由于在应用程序小部件中,我只能使用远程视图......我不知道这是否可能

有人知道吗?

谢谢!

4

19 回答 19

206

在文本视图中以编程方式执行此操作,在其他视图中未经测试 >>

TextView tv = (TextView) findViewById(R.id.mytext);
tv.setText("This is strike-thru");
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
于 2011-07-18T21:22:43.033 回答
83

另一种以编程方式执行此操作的方法看起来不像是 hack,而不是 Paint 方式:

而不是这样做:

tv.setText(s);

做:

private static final StrikethroughSpan STRIKE_THROUGH_SPAN = new StrikethroughSpan();
...
tv.setText(s, TextView.BufferType.SPANNABLE);
Spannable spannable = (Spannable) tv.getText();
spannable.setSpan(STRIKE_THROUGH_SPAN, 0, s.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
于 2012-07-31T15:43:23.010 回答
73

你可以使用这个:

remoteviews.setInt(R.id.YourTextView, "setPaintFlags", Paint.STRIKE_THRU_TEXT_FLAG | Paint.ANTI_ALIAS_FLAG);

当然,您也可以从 android.graphics.Paint 类中添加其他标志。

于 2011-10-09T11:12:24.433 回答
61

2015 年更新:伙计们,这是针对非常旧版本的 Android 的。查看现代解决方案的其他答案!


要删除整个文本视图,您可以使用特定的背景图像来模拟删除线效果:

android:background="@drawable/bg_strikethrough"

可绘制对象是一个 9-patch,它在bg_strikethrough中间保持一条实线,两边都在增长,不管你认为多少填充都是合理的。我用过这样的一个:

替代文字

(为了清楚起见放大了.. 1300% !)

替代文字

那是我的 HDPI 版本,所以保存它(第一个http://i.stack.imgur.com/nt6BK.png),res/drawable-hdpi/bg_strikethrough.9.png配置将这样工作:

替代文字

于 2011-01-20T20:37:26.093 回答
37

为此,您可以使用它

 title.setPaintFlags(title.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

对于删除,您可以使用它

 title.setPaintFlags(title.getPaintFlags() & (~Paint.STRIKE_THRU_TEXT_FLAG));
于 2017-05-07T20:32:44.063 回答
21

这是所有 Kotlin 人的扩展

fun TextView.showStrikeThrough(show: Boolean) {
    paintFlags =
            if (show) paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
            else paintFlags and Paint.STRIKE_THRU_TEXT_FLAG.inv()
}

用法

textView.showStrikeThrough(true)

局限性

删除线只能与文本颜色相同

(即红色文本和蓝色删除线是不可能的)

于 2019-04-02T17:19:09.523 回答
20

如果你有一个单词,我们可以使用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)
于 2014-12-05T09:59:45.553 回答
10

如果您使用字符串,这真的很容易:

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

然后只是:

<TextView 
        ...
         android:text="@string/line"
 />
于 2014-06-07T00:23:42.127 回答
9

对于多行 TextView,您应该像这样使用 android.text.style.CharacterStyle:

SpannableString spannable = new SpannableString(text);
spannable.setSpan(new StrikethroughSpan(), 0, text.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
remoteViews.setTextViewText(R.id.itemText, spannable);
于 2014-06-23T16:26:10.410 回答
8

添加以下行:-

TextView tv=(TextView) v.findViewById(android.R.id.text1);
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

使用您的参考而不是“电视”

于 2015-11-23T10:14:34.587 回答
6

制作一个可绘制的文件, triking_text.xml

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

布局xml

 <TextView
            ....
            ....
            android:background="@drawable/striking_text"
            android:foreground="@drawable/striking_text"
            android:text="69$"
           />

如果您的 API 级别 23 以下的最小 SDK 只使用背景 只是将背景和前景放在 Textview 中,那么 android studio 将显示一个错误,指出为 API >23 创建布局文件,然后删除 android:foreground="@主布局中的drawable/stricking_text”

输出如下所示: 在此处输入图像描述

于 2020-11-17T15:15:07.347 回答
5

试试这个代码

textview.setText((Html.fromHtml("<strike>hello world!</strike>")));
于 2018-05-21T09:05:15.487 回答
2

对于棒棒糖及以上。创建一个可绘制对象

<?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="@color/onePlusRed" />
        </shape>
    </item>
</selector>

并将其用作前景。
android:foreground="@drawable/strike_through"

于 2019-03-13T11:38:17.390 回答
2

科特林方式

val tv = findViewById<View>(R.id.mytext) as TextView
tv.text = "This is strike-through"
tv.paintFlags = tv.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG
于 2021-09-27T06:25:22.367 回答
1

Android 资源有很好的HTML 标记支持支持
以下 HTML 元素:

Bold: <b>, <em>
Italic: <i>, <cite>, <dfn>
25% larger text: <big>
20% smaller text: <small>
Setting font properties: <font face=”font_family“ color=”hex_color”&gt;. Examples of possible font families include monospace, serif, and sans_serif.
Setting a monospace font family: <tt>
Strikethrough: <s>, <strike>, <del>
Underline: <u>
Superscript: <sup>
Subscript: <sub>
Bullet points: <ul>, <li>
Line breaks: <br>
Division: <div>
CSS style: <span style=”color|background_color|text-decoration”&gt;
Paragraphs: <p dir=”rtl | ltr” style=”…”&gt;

但请注意,它不会在 android studio 布局预览中呈现。最后在 Android Studio 3.3.1 上测试

例如,删除线将如下所示:

<string name="cost"><strike>$10</strike> $5 a month</string>
于 2019-04-03T12:24:12.210 回答
0

你添加:

TextView variableTv = (TextView) findViewById(R.id.yourText);

你设置/添加你的变量:

variableTv.setText("It's Text use Style Strike");

然后在 variableTv 添加 .setPaintFlags :

variableTv.setPaintFlags(variableTv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
于 2017-04-04T08:34:42.910 回答
0

我尝试了几个选项,但这对我最有效:

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

干杯

于 2018-01-16T22:37:27.820 回答
-1

我已经在常规 (local) 上完成了此操作TextView,它应该适用于远程版本,因为文档将方法列为两者之间的等效方法:

remote_text_view.setText(Html.fromHtml("This is <del>crossed off</del>."));

于 2010-10-07T12:55:47.773 回答
-1

我知道,我正在回答一个老问题,它可能对其他人有帮助,以编程方式删除 TextView 的特定部分。

TextView textView = (TextView) findViewById(R.id.textView);
textView.setText("Text need to be set here", TextView.BufferType.SPANNABLE);
Spannable spannable = (Spannable) textView.getText();
spannable.setSpan(new StrikethroughSpan(), 5, 8, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

所以,在这个示例代码中,5 是开始位置,8 是结束位置的文本需要被删除,所以在运行这段代码后,我们可以得到文本“需要”被删除。希望它对其他人有帮助。

于 2018-03-15T09:20:54.930 回答