趁着热乎记录一下
在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()
{
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.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() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
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 block
e.printStackTrace();
}
}
}).start();
}
}
由于ClickableSpan捕获不到ontouch事件,所以,想在touch动作触发的时候改变文字的背景显然不太可行了,有的同学说通过监听TextView的ontouch事件,然后计算可以得到具体touch在了哪个超链接上,但这样过于复杂,而且对于我来说,这个功能可有可无
所以,我通过线程延迟100毫秒,在click发生之后改变点击字体背景,这样,虽然没有touch的效果好,但是也总比什么反应都没有强吧,当然,你也可以选择没有响应的Click,那就不用这么麻烦了,Click里直接定义动作就OK了
3.补充一下
通过重写ClickableSpan中的updateDrawState()方法,可以改变字体颜色,设置下划线等等功能
@Override
public void updateDrawState(TextPaint ds) {
// TODO Auto-generated method stub
super.updateDrawState(ds);
// ds.setHinting(Paint.HINTING_ON);
ds.setUnderlineText(false);
}
打完收工~~