我在String中输入以下数据:“Hello#this#is#sample#text。”
它为#字符之间的所有元素设置背景颜色。这是我到目前为止所得到的:
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行的样式。添加此样式功能后,在模拟器中感觉有点慢。也许我应该以其他方式接近它,例如使用自定义TextView和自定义绘图功能?
答案 0 :(得分:12)
这听起来像是一件有趣的事情。
关键是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一般没有多少经验,我不知道删除“#”的方式是否是最好的方法,但似乎有效。
答案 1 :(得分:0)
如何在返回结果之前删除它们,因为CharSequence不存在方法ReplaceAll?
您可以采用Html.fromHtml()
的方法 - 构建SpannedString
,不要尝试修改它。