(请忽略内容 - -)
分析
- 当我们在点击微博里 @张三 的时候,我们会跳转到 张三 的主页上面去;
- 在内容中还要有表情。
分析一下我们需要什么
- 一个带有clickablespan的自定义textView;
- 两个正则表达式分别来匹配”@xxx”和表情;
“@xxx”还要会变色,跟正文不一样。
看上去也不是很复杂嘛。ok,开工。
代码模块
首先是textView
public class SpanTextView extends TextView {
private SpannableString spannableString;
private Context context;
private final String AiteRule="@[^,,::\\s@]+"; // @人的正则表达式
private String MatchRule ="";
private String str="";
private MovementMethod mMovement;
public SpanTextView(Context context) {
super(context);
this.context = context;
}
public SpanTextView(Context context, AttributeSet attrs) {
super(context, attrs);
this.context = context;
}
public SpanTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.context = context;
}
@Override
public boolean hasFocusable(){
return false;
}
/**
* @param text
* @return
*/
public void setText(String text) {
if(getMatchRule()==null) {
/* 默认一个@的匹配规则 */
setMatchRule(AiteRule);
}
super.setText(setHighlight(text, getMatchRule()));
}
/**
* '@XXX
* @param text 文字
* @param rule 匹配规则
* @return
*/
private SpannableString setHighlight(String text,String rule) {
spannableString = new SpannableString(text);
Pattern pattern = Pattern.compile(rule);
Matcher matcher = pattern.matcher(text);
int length = text.length();
int end = 0;
for (int i = 0; i < length; i++) {
if (matcher.find()) {
int start = matcher.start();
end = matcher.end();
str = text.substring(start + 1, end);
spannableString.setSpan(new ClickSpan(context, str), start, end, Spanned.SPAN_MARK_POINT);
}
}
return spannableString;
}
public String getMatchRule() {
return MatchRule;
}
public void setMatchRule(String matchRule){n
this.MatchRule = matchRule;
}}
接下来是clickableSpan
public class ClickSpan extends ClickableSpan{
private Context context;
private String memberName="";