实现微博的@用户
#话题#
等效果
需要实现的功能
@用户
展示位蓝色块,和其他普通文字区分开来
@用户
点击这一块文本可以跳转到用户主页
@用户
删除到这一块时直接删除整块,不会留下其他字符
@用户
光标不会落到这块区域,只会在其前后位置出现
对于怎么实现具体用户和文本映射关系
- 可以采用特定格式的文本来映射对象关系
- 纯文本不映射,把对象关系放到另外一个字段来记录位置对应关系
实现颜色,点击事件
使用ForegroundColorSpan
实现不同颜色的区分
使用ClickableSpan
实现点击事件处理
实现整块区域操作
1.维护 map 集合,复杂,不好用
用一个 map 集合来保存对应的关系
参考:http://blog.csdn.net/u014702653/article/details/52799715
2.使用自定义 span,简单,效率高
利用 Span 的用法,
// 获取指定 span 的开始位置
public int getSpanStart(Object what)
// 获取指定 span 的结束位置
public int getSpanEnd(Object what)
// 获取指定 span 的 flag
public int getSpanFlags(Object what)
// 获取指定区域间所有的 span 对象
public <T> T[] getSpans(int queryStart, int queryEnd, @Nullable Class<T> kind)
比如自定一个 UserSpan
,TopicSpan
, 可以用来区分不同的 span
public class UserSpan{
...
}
public class TopicSpan{
...
}
一般这些自定义 span 可以继承 SpannableString
,用来直接显示文字, 内部在设置这个 span 为 ClickableSpan
,就是具备可以点击的文字了.
注意使用span
的一些问题
TextView 的 Editor 具体实现是SpannableStringBuilder,
在我们使用的append, insert,replace 都是最终调用到 replace 了.
当我们把自定义的 span replace 时,此时在这个 SpannableStringBuilder 中是不知道这个 span 的,只会当做 CharSequence
来处理,所以需要在 replace 后再次调用setSpan
一下,最后才能把这个 span 设置上去.
public SpannableStringBuilder replace(final int start, final int end,
CharSequence tb, int tbstart, int tbend)