我在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和自定义绘图功能?
解决方法
这听起来像是一件有趣的事情.
密钥是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一般没有多少经验,我不知道我删除“#”的方式是否是最好的方法,但它似乎有效.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。