TextView SpannableString 超链接点击相应

来源:互联网 发布:sql 树形结构 编辑:程序博客网 时间:2024/05/29 09:30

趁着热乎记录一下

在weibo神马的应用中,常常会有TextView中有超链接的功能,例如“@....”一点击,就进入了这个人的主页等等

为了在应用中实现,我想了一个临时的解决方法,虽然不是在touch中相应,但是如果要求不是很苛刻的话,也能用


1.找到需要超链接的字串,为它实例化SpannableString

for(int i = 0;i<linkNames.length;i++){SpannableString spStr = new SpannableString(linkNames[i]);spStr.setSpan(new LinkClickableSpan(), 0, linkNames[i].length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);mTextView.append(spStr);}mTextView.setMovementMethod(LinkMovementMethod.getInstance());mTextView.setFocusable(false);
setFocusable主要是为了让TextView失焦,以免和我listView上的item焦点冲突

linkNames是我需要超链接的内容,由于我的TextView中全部是一段一段的超链接,所以,一个循环搞定,如果有非超链接的内容,请同学们自行计算长度

2.重写ClickableSpan 

private class LinkClickableSpan extends ClickableSpan {    @Override    public void onClick(final View widget) {final TextView tv = (TextView) widget;final int start = tv.getSelectionStart();final int end = tv.getSelectionEnd();final SpannableString spStr = new SpannableString(tv.getText());    final Handler mHandler = new Handler()    {@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);if(msg.what == 1){spStr.setSpan(new BackgroundColorSpan(Color.parseColor("#A00099CC")), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);tv.setText(spStr);}else if(msg.what == 2){spStr.setSpan(new BackgroundColorSpan(Color.TRANSPARENT), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);tv.setText(spStr);//所需要的动作}}        };new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubtry {Message msg = new Message();msg.what = 1;mHandler.sendMessage(msg);Thread.sleep(100);msg = new Message();msg.what = 2;mHandler.sendMessage(msg);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}).start();    }}

由于ClickableSpan捕获不到ontouch事件,所以,想在touch动作触发的时候改变文字的背景显然不太可行了,有的同学说通过监听TextView的ontouch事件,然后计算可以得到具体touch在了哪个超链接上,但这样过于复杂,而且对于我来说,这个功能可有可无

所以,我通过线程延迟100毫秒,在click发生之后改变点击字体背景,这样,虽然没有touch的效果好,但是也总比什么反应都没有强吧,当然,你也可以选择没有响应的Click,那就不用这么麻烦了,Click里直接定义动作就OK了

3.补充一下

通过重写ClickableSpan中的updateDrawState()方法,可以改变字体颜色,设置下划线等等功能

    @Overridepublic void updateDrawState(TextPaint ds) {// TODO Auto-generated method stub    super.updateDrawState(ds);//    ds.setHinting(Paint.HINTING_ON);    ds.setUnderlineText(false);}

打完收工~~