首页 文章

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

提问于
浏览
29

我有一个来自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 回答

  • 1

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

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

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

  • 1

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

    Android: How to use the Html.TagHandler?

  • 26

    您可以使用自定义 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);
        }
    }
    ....
    
  • 0

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

  • 0

    它看起来并不真正支持,至少它在Android 3.1上不起作用 .

    @ RMS2如果文本很小,你可以把它分成两个或三个单独的文本视图,只将标记应用到你想要的那个,不适合长文本;(

相关问题