【问题标题】:Highlight text In TextView which might contains HTML tags突出显示 TextView 中可能包含 HTML 标记的文本
【发布时间】:2013-05-28 15:30:09
【问题描述】:

我想申请一个关于正则表达式的应用程序。用户输入一个正则表达式和一个测试文本,我想突出显示测试文本中与正则表达式匹配的所有内容。现在我做了这样的事情:

// txaTestText is an EditText
Editable testText = txaTestText.getText(); 

// pattern is a java.util.regex.Pattern input by user
Matcher matcher = pattern.matcher(testText);

// txaFindResult is a TextView
txaFindResult.setText(Html.fromHtml(matcher
        .replaceAll("<font color=\"red\">$0</font>")));

问题是用户可能会输入一些包含 HTML 标签的字符串作为测试文本。例如:

  • 正则表达式 = o
  • 测试文本 = Hello&lt;br&gt;world
  • 预期结果=Hell<b>o</b>&lt;br&gt;w<b>o</b>rld(由于StackOverflow不支持着色,我这里用粗体代替)
  • 实际结果=Hell<b>o</b><br>w<b>o</b>rld

我尝试使用Html.escapeHtml。但是它是在 API 级别 16 中添加的,而我的最低要求是 8。

我的问题是如何解决上述问题?

【问题讨论】:

  • 您可以尝试将&amp;lt; 替换为&amp;lt;,将&amp;gt; 替换为&amp;gt;
  • 如果正则表达式是&amp;lt;,测试文本是&amp;lt; &lt;,就会出错。
  • 我说的是结果,所以你应该在结果中替换它,而不是输入。
  • 你的意思是txaFindResult.setText(Html.fromHtml(matcher.replaceAll("&lt;font color=\"red\"&gt;$0&lt;/font&gt;").replace("&lt;", "&amp;lt;").replace("&gt;", "&amp;gt;")))?还是什么?
  • 抱歉,我不会用 Java 编写代码。这只是我从 PHP htmlspecialchars 中的一个函数中得到的一个想法。

标签: java android regex textview highlight


【解决方案1】:

你应该使用Spans:

Spannables 可用于替换 TextView 文本的部分:例如用ForeGroundColorSpan 着色。它甚至可以用于引入与文本内联的图像(文本消息中的表情符号)。

这是一个突出显示&lt;br&gt; 部分的硬编码示例。你应该添加正则表达式算法:

MainActivity.java

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView textView = (TextView)findViewById(R.id.helloworld);
        Spannable spannableString = new SpannableString(getString(R.string.hello_world));        
        spannableString.setSpan(new ForegroundColorSpan(Color.RED), 5, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        textView.setText(spannableString);

    }

strings.xml

<string name="hello_world">
  <![CDATA[
    Hello <br> World 
  ]]>
</string>

ma​​in.xml

<TextView
    android:id="@+id/helloworld"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:text="@string/hello_world" />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-22
    • 1970-01-01
    • 2016-10-29
    • 2021-11-28
    • 2023-04-07
    • 2011-01-08
    • 2011-12-14
    相关资源
    最近更新 更多