Android中使用TextView实现微博@功能
来源:互联网 发布:三国志9优化伴侣说明 编辑:程序博客网 时间:2024/06/17 09:09
前言
在Android中使用TextView实现@功能主要需要用到以下两个知识点:
- 正则表达式:http://blog.csdn.net/yaerfeng/article/details/28855587
- SpannableString:http://www.jianshu.com/p/84067ad289d2
实现思路
- 使用正则表达式找出字符串中所有
@用户名
部分在字符串中的起止位置; - 初始化一个 SpannableString ,利用第一步中获取的起止位置来设置 ClickableSpan;
- 将 SpannableString 设置给 TextView
具体实现
一、使用正则表达式找出字符串中所有 @用户名
的部分
1.1 根据 @用户名
的命名匹配规则,编写正则表达式
如匹配规则为:
- 以@开头
- 用户名可为字母、下划线、中文,长度为4-30个字符
- 空格结尾
则正则表达式可定义为:
String NAME_RULE = "@[a-zA-Z_\u4e00-\u9fa5]{4,30} ";
PS:正则表达式必须根据需求给定的命名规则来定
1.2 找出字符串中所有符合正则匹配的部分,并记录其信息(开始的位置、结束的位置、文字内容)
首先我们先定义一个模型类 AtBean 来存放匹配部分的信息
AtBean.class
public class AtBean { //文字 private String name; //开始的位置 private int startPos; //结束的位置 private int endPos; public AtBean(String name, int startPos, int endPos) { this.name = name; this.startPos = startPos; this.endPos = endPos; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getStartPos() { return startPos; } public void setStartPos(int startPos) { this.startPos = startPos; } public int getEndPos() { return endPos; } public void setEndPos(int endPos) { this.endPos = endPos; } @Override public String toString() { return "name --> " + name + " startPos --> " + startPos + " endPos --> " + endPos; }}
进行正则匹配,将获取到的信息保存到数组 atBeanList 中
getAtBeanList(String str)
private List<AtBean> getAtBeanList(String str) { List<AtBean> atBeanList = new ArrayList<>(); // 正则表达式 String NAME_RULE = "@[a-zA-Z_\u4e00-\u9fa5]{4,30} "; // 编译正则表达式 Pattern pattern = Pattern.compile(NAME_RULE); Matcher m = pattern.matcher(str); while (m.find()) { AtBean bean = new AtBean(m.group(), m.start(), m.end()); atBeanList.add(bean); Log.i("Find AT String", bean.toString()); } return atBeanList;}
二、设置 SpannableString
2.1 新建 ClickableSpan 的子类 Clickable ,为 @用户名
设置样式和点击事件
Clickable.class
private class Clickable extends ClickableSpan implements View.OnClickListener { private View.OnClickListener mListener; private Context context; private Clickable(Context context,View.OnClickListener mListener) { this.context = context; this.mListener = mListener; } //设置显示样式 @Override public void updateDrawState(TextPaint ds) { super.updateDrawState(ds); ds.setColor(ContextCompat.getColor(context, R.color.colorPrimary));//设置颜色 ds.setUnderlineText(false);//设置下划线 } @Override public void onClick(View v) { mListener.onClick(v); }}
2.2 将 Clickable 添加到 SpannableString 中
getClickSpannableString(String str, List atBeanList)
private SpannableString getClickSpannableString(String str, List<AtBean> atBeanList) { SpannableString spannableStr = new SpannableString(str); for (final AtBean atBean : atBeanList) { spannableStr.setSpan(new Clickable(MainActivity.this,new View.OnClickListener() { @Override public void onClick(View v) { //每个 @用户名 字符串的点击事件 Toast.makeText(MainActivity.this, "点击了 ————> " + atBean.getName(), Toast.LENGTH_SHORT).show(); } }), atBean.getStartPos(), atBean.getEndPos(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); } return spannableStr;}
三、将 SpannableString 设置给 TextView
List<AtBean> atBeanList = getAtBeanList(str); SpannableString spannableStr = getClickSpannableString(str, atBeanList); showTv.setText(spannableStr); //激活点击事件 showTv.setMovementMethod(LinkMovementMethod.getInstance());
完整代码地址:https://github.com/HC-lee/AtTextView
0 0
- Android中使用TextView实现微博@功能
- android中textview竖排显示,只能说功能实现了
- Android自定义TextView实现跑马灯功能
- Android TextView跑马灯功能实现
- Android多颜色TextView功能实现
- android TextView实现复制粘贴功能
- TextView中超链接功能的实现
- Android中使用TextView图文混排实现动态表情
- Android中TextView深入使用----单独TextView实现图文混排
- android中textview使用 html
- android中使用Rxjava实现倒计时功能
- Android中SpannableString学习以及实现自定义TextView的显示更多(展开)和收起功能
- TextView: android中TextView实现单行跑马灯
- android textView常用功能
- Android TextView 复制功能
- android中TextView实现单行跑马灯
- android中TextView实现单行跑马灯
- Android TextView drawableLeft 在代码中实现
- 深度学习之k-近邻算法识别手写图片
- compile amule
- Android数据安全之RSA加密(非对称加密)
- CentOS6.8升级Python2.6到Python2.7并安装pip
- shell脚本报错:-bash: xxx: /bin/sh^M: bad interpreter: No such file or directory
- Android中使用TextView实现微博@功能
- Shiro密码的MD5加密
- 1416 两点 51NOD
- java中Collections详解
- JAVA CAS原理分析
- H5本地存储之存储JSON格式数据
- Android中的序列化方式
- d3.js 解决——元素覆盖
- 如何使用Git上传文件到Github之tortoiseGit的使用(二)