【问题标题】:Specifying "strikethrough" on a section of TextView text在 TextView 文本的一部分上指定“删除线”
【发布时间】:2010-11-29 06:45:45
【问题描述】:

我有一个来自网络服务的文本块,根据我预定义的一些标签,我想在将文本设置为我的 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 行,所以我想知道是否有更优雅的解决方案。

【问题讨论】:

    标签: android textview


    【解决方案1】:

    如果它只是 TextView,你可以使用绘制标志来删除

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

    【讨论】:

    • 谢谢,但这看起来适用于整个文本。我只需要删除文本的一部分 - 任何被连字符包围的单词,例如。 -这个-或-那个-。
    • RMS2 你有没有为你的问题找到任何解决方案?请张贴。
    • @Sandiskp 看看我的回答
    • 感谢重播,但收到这样的回复 5000 10000 使用 Html.fromhtml(string) 设置的计划可享受 50% 的折扣 我该如何处理 请帮助我只有一个 textview
    【解决方案2】:

    如果您想删除整个 TextView,但如果您只想删除文本的某些部分,则@Suresh 解决方案有效,请使用以下代码。

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

    【讨论】:

    • 我将实际价格、报价和折扣百分比作为单个字符串值获取,并且为此提供一个文本视图。
    • 取决于您获取值的方式,您可以拆分值,为不同的值应用单独的 Spannable,然后将其设置为文本。我没有亲自做过,但应该可以。
    • @RohanKandwal 谢谢。如何更改删除线颜色?
    • @Shayan_Aryan 我不确定,你能试试这个stackoverflow.com/q/25439860/1979347
    • 有效。非常感谢。
    【解决方案3】:

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

    Android: How to use the Html.TagHandler?

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        您确定Html.fromHtml 不支持&lt;strike&gt;?它列在this Commonsware blog post

        【讨论】:

        • 标签在 android 中不支持,我已经检查到 ICS 4.0.4
        • 在 Jelly bean 中不受支持。
        【解决方案6】:

        貌似不是真的支持,至少Android 3.1不支持。

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

        【讨论】:

          【解决方案7】:

          我们使用的大多数应用程序都将在整个项目中的某个地方使用文本,幸运的是,KTX 为这些部分提供了一些扩展功能。对于文本,我们本质上为 SpannableStringBuilder 类提供了一些函数。 例如,在实例化 Builder 实例后,我们可以使用 build 方法附加一些粗体文本:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-08-30
            • 2013-02-05
            • 1970-01-01
            相关资源
            最近更新 更多