在TextView文本的某个部分指定“删除线”

32

我从一个 Web 服务获取了一段文本,根据我预定义的一些标签,我想在将其设置到我的 TextView 之前对其进行样式设置。对于加粗、斜体和下划线,我可以很容易地使用 replaceAll 命令实现:

PageText = PageText.replaceAll("\\*([a-zA-Z0-9]+)\\*", "<b>$1</b>");
        PageText = PageText.replaceAll("=([a-zA-Z0-9]+)=", "<i>$1</i>");            
        PageText = PageText.replaceAll("_([a-zA-Z0-9]+)_", "<u>$1</u>");
txtPage.setText(Html.fromHtml(PageText), TextView.BufferType.SPANNABLE);

想要加粗一个单词,将其用 * 包裹起来;想要斜体,将其用 _ 包裹起来。

然而,Html.fromHtml不支持 "strike" 标签,所以无法使用相同的方法来完成删除线。我看到有人用 Spannable 来设置文本的样式,但它需要位置数字。因此,我可以循环遍历文本,搜索 -(表示删除线的标签),然后搜索下一个标签,跨越之间的文本,并重复所有这样的字符串。这最终会成为 10 行循环代码,而其他方法只需要 1 行,因此我想知道是否存在更优雅的解决方案。

6个回答

95
如果只是TextView,您可以使用绘制标志来划掉。
TextView tv=(TextView) v.findViewById(android.R.id.text1);
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);

3
谢谢,但这似乎适用于整个文本。我只需要在文本的一部分划掉一些单词,即由破折号包围的任何单词,例如-this-或-that-。 - RMS2
RMS2,你有找到你问题的解决方案吗?请发布出来。 - Sandip Lawate
@Sandiskp,请看我的回答。 - Rohan Kandwal
谢谢回复,但我收到的响应是这样的:5000 <del>10000</del> 50%折扣计划使用Html.fromhtml(string)设置,我该如何处理,请帮忙,我只有一个textview。 - Harsha

38

@Suresh的解决方案适用于您想在整个TextView中添加删除线的情况,但如果您只想在文本的某些部分添加删除线,则请使用下面的代码。

    tvMRP.setText(text, TextView.BufferType.SPANNABLE);
    Spannable spannable = (Spannable) tvMRP.getText();
    spannable.setSpan(new StrikethroughSpan(), 3, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

在这里,text是我们希望TextView显示的文本,3是要从哪个字符(从0开始)开始删除线。


我正在获取实际价格、优惠价格和折扣百分比作为单个字符串值,并且还有一个文本视图用于显示它们。 - Harsha
根据您获取值的方式,您可以拆分这些值,为不同的值应用单独的Spannable,然后将其设置为文本。我个人没有尝试过这样做,但应该是可行的。 - Rohan Kandwal
@RohanKandwal 谢谢。我怎么改变删除线的颜色? - Shayan_Aryan
@Shayan_Aryan 我不确定,你可以尝试一下这个链接:https://dev59.com/L4Lba4cB1Zd3GeqPiLel - Rohan Kandwal
可以了。非常感谢。 - DmitryKanunnikoff

1
您可以使用自定义的TagHandler来实现,例如这个SO问题中的一个:
Spanned parsed = Html.fromHtml(PageText, null, new MyHtmlTagHandler());

而且 TagHandler 实现了以下方法:

public void handleTag(boolean opening, String tag, Editable output,
        XMLReader xmlReader) {
    if(tag.equalsIgnoreCase("strike") || tag.equals("s")) {
        processStrike(opening, output);
    }
}
....

0

5
在安卓系统中,不支持使用"<Strike>"标签,我已经检查过包括ICS 4.0.4在内的所有版本。 - Bytecode
4
Jelly Bean不支持<strike>或<s>。 - Basbous

0

看起来 不是真正支持的,至少在Android 3.1上不起作用。

@RMS2 如果文本很小,您可以将其拆分为两个或三个单独的文本视图,并仅将标志应用于您想要的那个,对于长文本并不完美 ;(


0

我们工作中使用的大多数应用程序都会在项目中的某个地方使用文本,幸运的是,KTX在处理这些部分时提供了一些扩展函数。对于文本,我们基本上可以为SpannableStringBuilder类使用一些可用的函数。 例如,在实例化Builder实例后,我们可以使用build方法来添加一些粗体文本:

 textView.text =buildSpannedString {
        strikeThrough {
            append(
                value ?: ""
            )
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接