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

时间:2010-11-29 06:45:45

标签: 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);

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

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

6 个答案:

答案 0 :(得分:93)

如果它只是TextView,你可以使用油漆标记

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

答案 1 :(得分:30)

@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开始)。

答案 2 :(得分:1)

以下是使用自定义TagHandler的解决方案,您必须传递给Html.fromHtml()。

Android: How to use the Html.TagHandler?

答案 3 :(得分:1)

您可以使用自定义TagHandler执行此操作,例如on this SO question

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

答案 4 :(得分:0)

您确定Html.fromHtml不支持<strike>吗?它列在this Commonsware blog post

答案 5 :(得分:0)

看起来似乎并不支持,至少它在Android 3.1上不起作用。

@ RMS2如果文字较小,您可以将其分成两个或三个单独的文本视图,并仅将标记应用于您想要的文本,不适用于长文本;(