// 基本方法介绍 // 1. 构造方法里接收一个字符串作为基本数据 SpannableString span = new SpannableString(str); // 2. 为指定区间的字符串增加特殊属性 span.setSpan(object,start,end,flags); // 3. 设置复合字符串为TextView的正文 tv_arties.setText(span); |
// 初始文本数据 String str = "我只是一个表情而已 (~ o ~)~zZ"; // 参数1 创建可点击的Span ClickableSpan clickableSpan= new ClickableSpan() { @Override public void onClick(View widget) { Toast.makeText(MainActivity.this, "\'只是\'被点击了~\',可以跳转界面或者开启数据加载", Toast.LENGTH_SHORT).show(); } }; // 参数2 可点击字符的开始位置 int start = 1; // 参数3 可点击字符的终止位置 int end = 3; // 参数4 选择点击字符范围的方式 int flags = SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE; // 参数5 MovementMethod movementMethod = LinkMovementMethod.getInstance(); // 基本使用方法 // 1. 构造方法里接收一个字符串作为基本数据 SpannableString span = new SpannableString(str); // 2. 为指定区间的字符串增加特性 span.setSpan(clickableSpan,start,end,flags); // 3. 设置复合字符串为TextView的正文 tv_arties.setText(span); // 4. 设置点击事件的分配,以处理TextView内可能存在的多个ClickSpan tv_arties.setMovementMethod(movementMethod); |
具体的值有: SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE,在start和end区间内新增字符才受span影响 SpannableString.SPAN_EXCLUSIVE_INCLUSIVE,在start前的新增字符不受span影响,在end后新增字符受span影响 SpannableString.SPAN_INCLUSIVE_EXCLUSIVE,在start前的新增字符受span影响,在end后新增字符不受span影响 SpannableString.SPAN_INCLUSIVE_INCLUSIVE,在start或end前后新增字符都受span影响 |
2.png (18.36 KB, 下载次数: 16)
3.png (19.85 KB, 下载次数: 27)
4.png (12.3 KB, 下载次数: 14)
/** * 将字符串内容的#话题#设置为可点击,并放入TextView</br> * 搜索关键字:SpannableString,ClickableSpan</br> * @param msgSpan 需要传入SpannableString对象,此方法使用完后还要继续添加@联系人的的点击处理,要共用同一个对象 */ public static void setTopicSpan(TextView textView, SpannableString msgSpan) { // 参数1 #话题#使用的正则表达式,正则验证网站 : http://tool.chinaz.com/regex/ String topicPatternStr = "#(.+?)#"; // 参数2 使用正则表达式创建查询对象 Pattern topicPattern = Pattern.compile(topicPatternStr); // 参数3 使用正则查找出msgSpan里所有的话题 Matcher matcher = topicPattern.matcher(msgSpan); while (matcher.find()) { // matcher.group() 的返回值为匹配出来的字符串 String topicName = matcher.group(); Log.e(TAG, "start=" + matcher.start() + ";end=" + matcher.end() + ";话题为:=" + topicName); // 自定义的ClickableSpan,构造方法里接收话题字符串 ClickableSpan clickableSpan = new TopicClickableSpan(topicName); // 设置点击 msgSpan.setSpan(clickableSpan, matcher.start(), matcher.end(), SpannableString.SPAN_INCLUSIVE_EXCLUSIVE); } textView.setText(msgSpan); textView.setMovementMethod(LinkMovementMethod.getInstance()); } |
private static class TopicClickableSpan extends ClickableSpan { private String topic; /** 由于ClickableSpan的onClick方法参数为View,无法区分出被点击的span,只能在构造方法里传递话题字符串以供区分 */ private TopicClickableSpan(String topic){ this.topic = topic; } public void onClick(View widget) { Toast.makeText(widget.getContext(), "被点击的话题是:"+topic, 1).show(); } }; |
int emojiResId = EmojiList.findEmoji(emojiName); if (emojiResId != -1) { // 参数4 如果查询到图片则将SpannableString里表情文字替换为图片 ImageSpan emojiSpan = new ImageSpan(textView.getContext(), emojiResId); msgSpan.setSpan(emojiSpan, matcher.start(), matcher.end(), SpannableString.SPAN_INCLUSIVE_EXCLUSIVE); } |
msgSpan.setSpan(httpPicSpan, start, end, SpannableString.SPAN_INCLUSIVE_EXCLUSIVE); msgSpan.setSpan(clickableSpan,start,end, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE); |
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) | 黑马程序员IT技术论坛 X3.2 |