从可扩展的CharSequence中删除字符

我在string中有以下input数据:“你好#这#是#示例#文本。”

它为#个字符之间的所有元素设置背景颜色。 这是我到目前为止:

public static CharSequence colorBackground(CharSequence text) { Pattern pattern = Pattern.compile("#(.*?)#"); Spannable spannable = new SpannableString( text ); if( pattern != null ) { Matcher matcher = pattern.matcher( text ); while( matcher.find() ) { int start = matcher.start(); int end = matcher.end(); CharacterStyle span = new BackgroundColorSpan(0xFF404040); spannable.setSpan( span, start, end, 0 ); } } return spannable; } 

设置背景颜色的作品,但占位符字符#的样式。 如何在返回结果之前删除它们,因为CharSequence方法不存在方法ReplaceAll?

我使用这个函数在ListView中设置TextView行的样式。 添加这个样式函数之后,仿真器感觉有点慢。 也许我应该以某种其他方式来处理它,例如使用具有自定义绘图function的自定义TextView?

Solutions Collecting From Web of "从可扩展的CharSequence中删除字符"

这听起来像是一件有趣的事情,试图找出。

关键是SpannableStringBuilder 。 使用SpannableString时,文本本身是不可变的,但是对于SpannableStringBuilder,文本和标记都可以改变。 考虑到这一点,我修改了你的代码片段来做你想做的事情:

 public static CharSequence colorBackground(CharSequence text) { Pattern pattern = Pattern.compile("#(.*?)#"); SpannableStringBuilder ssb = new SpannableStringBuilder( text ); if( pattern != null ) { Matcher matcher = pattern.matcher( text ); int matchesSoFar = 0; while( matcher.find() ) { int start = matcher.start() - (matchesSoFar * 2); int end = matcher.end() - (matchesSoFar * 2); CharacterStyle span = new BackgroundColorSpan(0xFF404040); ssb.setSpan( span, start + 1, end - 1, 0 ); ssb.delete(start, start + 1); ssb.delete(end - 2, end -1); matchesSoFar++; } } return ssb; } 

我一般对Spannables没有太多的经验,我不知道我删除“#”的方法是否是最好的方法,但似乎有效。

如何在返回结果之前删除它们,因为CharSequence方法不存在方法ReplaceAll?

你可以采取Html.fromHtml() – build立SpannedString ,不要尝试修改它。