有没有简单的方法可以删除应用程序小部件中的文本?


138

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

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

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

有人知道吗?

谢谢!


在这里查看我的答案!stackoverflow.com/a/35351523/250260
Jorgesys '16

如果您想要xml-only像我这样的解决方案:stackoverflow.com/a/49062515/3579786
Jiyeh

1
这可能会有所帮助... 6种方法-Android TextView StrikeThrough
c49

Answers:


68

您可以使用此:

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

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


8
不知道这怎么没有得到更多的选票,它完美地回答了这个问题。谢谢。
詹姆斯·克罗斯

首先,不清楚什么是remoteviews,而且不适用于所有android版本。
akshat tailang

这是我们正在寻找的答案,只有通过removeViews才能在androidTextViews上使用app-widgets。目前无法直接访问TextView。
欣赏

188

要在textview中以编程方式进行此操作,而在其他视图中未经测试>>

TextView tv = (TextView) findViewById(R.id.mytext);
tv.setText("This is strike-thru");
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

13
对于应用小部件,这是不可能的。它们仅与RemoteViews一起使用,并且没有读取油漆标志的方法。
Ridcully

78

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

而不是做:

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

谢谢,就像魅力一样。特别是当您需要TextView的某些部分具有删除线时
Diljeet 2013年

带有Spannable的+1解决方案有效,非常感谢。你救了我的日子。谢谢男人;)
Simon Dorociak 2014年

这不能回答问题,因为这不适用于RemoteView
Alex.F,2015年

@ Alex.FI有点惊讶,因为它确实在通知(例如远程视图)中起作用。我必须承认我还没有使用AppWidgets进行测试。
BoD

1
它确实可以与App Widgets一起使用(任何实现ParcelableSpan的框架范围都可以使用)
Karsten 2015年

58

2015更新:伙计们,这是用于非常旧版本的Android。查看其他答案以获得现代解决方案!


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

android:background="@drawable/bg_strikethrough"

bg_strikethrough绘制一个9补丁,保持实线中间穿过,增长两侧,但是有很多的填充你认为是合理的。我用过这样的一个:

替代文字

(为清楚起见,进行了放大。.1300%!)

替代文字

那是我的HDPI版本,因此将其保存为(第一个http://i.stack.imgur.com/nt6BK.png),res/drawable-hdpi/bg_strikethrough.9.png配置将按以下方式工作:

替代文字


如果TextView的长度大于文本的长度,并且只能删除文本,该怎么办?
maysi

仅用于黑色和一行文本... @ruhalde为我工作。
ahmed_khan_89 '16

27

为此,您可以使用此

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

对于删除,您可以使用此

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

1
我如何添加罢工颜色
Harsha

@Harsha这似乎只允许您使用文本的颜色。如果您想要不同的删除线颜色,则必须尝试其他实现方法。
迈克尔

19

如果您只有一个字,我们可以使用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)

@Skizo我很高兴它对您
有所

13

这是所有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)

局限性

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

(即不可能使用红色文本和蓝色删除线)


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

8

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

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

然后:

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

4
@war_Hero为我工作,但是不会在Android Studio的渲染器中渲染。必须实际构建它才能看到它。
Mic Fok

8

在下面添加行:

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

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


1
这不涉及该问题,他询问的是AppWidget中的RemoteViews对象。
马修

3

试试这个代码

textview.setText((Html.fromHtml("<strike>hello world!</strike>")));

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"


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

0

我尝试了几种选择,但是,这最适合我:

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

干杯


0

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”>. 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”>
Paragraphs: <p dir=”rtl | ltr style=”…”>

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

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

<string name="cost"><strike>$10</strike> $5 a month</string>

-1

我已经在常规(本地)上完成了此操作TextView,并且它应该在远程版本上也可以使用,因为文档列出了在两者之间等效的方法:

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


它不起作用:(。我正在这样做:remoteView.setTextViewText(R.id.text,Html.fromHtml(“ <​​del>” + value +“ </ del>”)));
安东尼奥

可能<del>不受的支持Html.fromHtml()。您尝试过<strike>还是<s>
Blrfl 2010年

感谢Blrfl,但它也不起作用。似乎只有少数HTML标记由Html.fromHtml()支持。
安东尼奥

笨蛋 对不起,我帮不上忙。
Blrfl 2010年

我该如何通过像购物应用程序这样的罢工来实现价格
Harsha 2015年

-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,因此运行此代码后,我们可以删除文本“需要”。希望对其他人有帮助。

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.