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

Posted

技术标签:

【中文标题】有没有一种简单的方法可以删除应用小部件中的文本?【英文标题】:Is there an easy way to strike through text in an app widget? 【发布时间】:2011-04-22 08:18:48 【问题描述】:

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

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

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

有人知道吗?

谢谢!

【问题讨论】:

在这里查看我的答案! ***.com/a/35351523/250260 如果你想要像我这样的xml-only 解决方案:***.com/a/49062515/3579786 【参考方案1】:

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

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

【讨论】:

这对于 App-Widgets 是不可能的。它们仅适用于 RemoteViews,没有读取绘制标志的方法。【参考方案2】:

另一种以编程方式执行此操作的方式,它看起来比 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 的某些部分有删除线时 +1 使用 Spannable 的解决方案有效,非常感谢。你拯救了我的一天。谢谢人;) 这不能回答问题,因为这不适用于RemoteView @Alex.F 我有点惊讶,因为这确实适用于通知(这是远程视图)。我必须承认我还没有用 AppWidgets 测试过。 它确实适用于 App Widgets(任何实现 ParcelableSpan 的框架跨度都应该适用)【参考方案3】:

你可以用这个:

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

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

【讨论】:

不知道这怎么没有得到更多的选票,它完美地回答了这个问题。谢谢。 首先不清楚什么是 remoteviews ,而且不适用于所有 android 版本。 这是我们正在寻找的答案,在 androidTextViews 上使用 app-widgets 只能通过 removeViews 访问。此时无法直接访问 TextView。【参考方案4】:

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


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

android:background="@drawable/bg_strikethrough"

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

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

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

【讨论】:

如果TextView比文本长,只需要删除文本怎么办? 仅适用于黑色和单行文本...@ruhalde 为我工作。【参考方案5】:

为此,您可以使用此

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

对于删除你可以使用这个

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

【讨论】:

如何添加罢工颜色 @Harsha 这似乎只允许您使用文本的颜色。如果您想要不同的删除线颜色,则必须尝试其他实现方法。【参考方案6】:

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

限制

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

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

【讨论】:

【参考方案7】:

如果你有一个单词,我们可以使用 drawable。 以下是示例:

<item android:state_pressed="false"><shape android:shape="line">
        <stroke android: 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 很高兴它对你有所帮助【参考方案8】:

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

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

然后就是:

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

【讨论】:

@war_Hero 为我工作,但不在 Android Studio 的渲染器中渲染。必须实际构建它才能看到它。【参考方案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);

【讨论】:

【参考方案10】:

添加以下行:-

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

使用您的参考而不是“tv”

【讨论】:

这没有引用问题,他是在询问 AppWidget 中的 RemoteViews 对象。【参考方案11】:

制作一个可绘制的文件, striking_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: 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$"
           />

如果您的最低 SDK 低于 API 级别 23,则只需使用后台 只需将背景和前景放在 Textview 中,然后 android studio 将显示一个错误,说为 API >23 创建布局文件,然后删除 android:foreground="@drawable/ stricking_text" 来自主布局

输出如下所示:

【讨论】:

【参考方案12】:

试试这个代码

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

【讨论】:

【参考方案13】:

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

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

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

【讨论】:

这仅适用于单行文本,因为它依赖于视图【参考方案14】:

科特林方式

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

【讨论】:

【参考方案15】:

Android资源已经不错了HTML markup support 支持以下 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>

【讨论】:

【参考方案16】:

你添加:

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

您在 You 变量中设置/添加:

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

然后在 variableTv 中添加 .setPaintFlags :

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

【讨论】:

【参考方案17】:

我尝试了几个选项,但这对我来说效果最好:

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

干杯

【讨论】:

【参考方案18】:

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

remote_text_view.setText(Html.fromHtml("This is &lt;del&gt;crossed off&lt;/del&gt;."));

【讨论】:

它不起作用:(。我正在这样做:remoteView.setTextViewText(R.id.text, Html.fromHtml("" + value + "")) ; 可能是&lt;del&gt; 不支持Html.fromHtml()。你试过&lt;strike&gt;&lt;s&gt;吗? 感谢 Blrfl,但它也不起作用。 Html.fromHtml() 似乎只支持少数 HTML 标签。 无赖。抱歉,我帮不上忙。 我怎样才能通过像购物应用程序这样的罢工来实现价格优惠【参考方案19】:

我知道,我正在回答一个老问题,它可能对其他人有所帮助,以编程方式删除 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 是结束位置的文本需要被删除,所以运行这段代码后,我们可以得到文本“需要”被删除。希望对其他人有所帮助。

【讨论】:

以上是关于有没有一种简单的方法可以删除应用小部件中的文本?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据应用程序小部件中文本视图中的小部件大小调整文本大小?

ipywidgets Textarea on_submit()

所有小部件的颤振填充?

有没有一种简单的方法可以在没有图像的情况下为 Kivy 标签、按钮、小部件等添加边框?

读取 txt 文件并插入文本小部件后显示的括号。任何简单的修复方法?

如何遍历窗口中的所有小部件?