突出显示文本在TextView中可能包含HTML标记

问题描述:

我想制作一个关于正则表达式的应用程序。用户输入一个正则表达式和一个测试文本,我想在测试文本中突出显示与正则表达式匹配的所有内容。现在我做了这样的事情:突出显示文本在TextView中可能包含HTML标记

// 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<br>world
  • 预期的结果= Hello<br>world(由于*上不支持着色,我用黑体这里代替)
  • 真正的结果= Hello
    world

我试着用Html.escapeHtml。然而它被添加在API级别16,而我的最低要求是8.

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

+0

您可以尝试用'<'和'>'用'>'替代' HamZa

+0

如果正则表达式为“ johnchen902

+0

我说的是结果,所以你应该在结果中取代它,而不是输入。 – HamZa

你应该使用Spans

Spannables可用于TextView的文本的备用零件:例如颜色与ForeGroundColorSpan。它甚至可以用于与文本(文本消息中的表情符号)内联地引入图像。

这里是一个硬编码的例子,突出显示<br>部分。你应该添加的正则表达式algorithme:

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> 

main.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" /> 

Screenshot highlight <br> tag