TextView SpannableString 超链接点击相应

趁着热乎记录一下

在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);
			}

打完收工~~




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值