在TextView文本的一部分上指定"删除线"

RMS*_*MS2 31 android textview

我有一个来自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);
Run Code Online (Sandbox Code Playgroud)

所以,要加粗一个单词,用*表示它,用斜体表示,用_表示.

但是,对于删除线,Html.fromHtml不支持"strike"标记,因此不能以同样的方式完成.我已经看到使用Spannable在文本的一个部分上设置样式的示例,但它需要位置编号.所以,我想我可以遍历文本,搜索 - (标记代表警示),然后搜索下一个,跨越中间的文本,并重复所有这些字符串.它最终将成为10行循环代码,而其他代码则为1行,所以我想知道是否有更优雅的解决方案.

Sur*_*esh 93

如果它只是TextView,您可以使用绘制标记进行打击

TextView tv=(TextView) v.findViewById(android.R.id.text1);
tv.setPaintFlags(tv.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,但这似乎适用于整个文本.我只需要删除文本的一部分 - 任何用连字符包围的单词,例如.-这个或那个-. (2认同)

Roh*_*wal 32

@Suresh解决方案如果你想要删除整个TextView,但是如果你想仅删除文本的某些部分,那么使用下面的代码.

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

text是我们想要TextView显示的文本,3是no.从删除线开始的字符(从0开始).