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

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

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

但是因为在一个应用小部件中,我只能使用远程视图... 我不知道这是否可行

有人知道这件事吗?

谢谢!

118455 次浏览

我已经在一个常规(本地) TextView上完成了这项工作,它应该可以在远程变量上工作,因为文档列出了两者之间的等价方法:

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

2015年更新: 观众朋友们,这是针对非常老版本的安卓系统的,请参阅其他现代解决方案的答案!


为了在整个文本视图中进行删除,您可以使用一个特定的背景图像来模拟删除效果:

android:background="@drawable/bg_strikethrough"

其中的 bg_strikethrough绘制是一个9补丁,保持一个实线通过中间,增长任何一方,无论多少填充你认为是合理的。我用过这样一个:

alt text

(为了清晰... 1300% !)

alt text

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

alt text

在 textview 中以编程方式执行,未经其他视图测试 > >

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

你可以用这个:

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

当然,您也可以从 android.Graphy.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);

如果你使用字符串,那真的很简单:

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

然后就是:

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

对于多行 TextView,你应该使用 android.text.style:

SpannableString spannable = new SpannableString(text);
spannable.setSpan(new StrikethroughSpan(), 0, text.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
remoteViews.setTextViewText(R.id.itemText, spannable);

如果你有一个单词,我们可以使用绘制。 下面是一个例子:

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

添加以下一行:-

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

用你的推荐信而不是“电视”

你加上:

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

这样做,你可以利用这一点

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

你可以用这个

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

我尝试了一些选择,但这对我来说效果最好:

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

干杯

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

试试这个代码

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

为棒棒糖和以上。创建一个可绘制的

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

这是给所有科特林人的分机号码

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)

限制

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

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

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 工作室布局预览中呈现

例如,Strikethrough 看起来是这样的:

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

制作一个可绘制的文件夹, Strike _ 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>

布局

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

如果您的最低 SDK 低于 API 水平23只是使用背景 或者 只要把背景和前景放在 Textview,android 工作室就会显示一个错误,说为 API > 23创建一个布局文件,然后从主布局中移除 Android: foreground = “@draable/stricking _ text”

输出结果如下: enter image description here

Kotlin 的方式

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

您可以使用数据绑定! 在 XML 布局中,只需执行 app: strike = “@{ true }”

@BindingAdapter("strike")
fun bindTextView(view: TextView, strike: Boolean) {
if (strike) {
view.paintFlags = view.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG or Paint.ANTI_ALIAS_FLAG
} else {
view.paintFlags = 0 or Paint.ANTI_ALIAS_FLAG
}
}

Kotlin 的方式

averagePrice.paintFlags = Paint.STRIKE_THRU_TEXT_FLAG