您的位置:首页 > 其它

TextView ClickableSpan onClickListener点击事件冲突

2016-04-08 17:57 471 查看
需求是这样的:

TextView是在一个ListView item里面,TextView的文本需要格式。当有‘@’或者‘网址’时,将它们的文本高亮并且点击时进行跳转,当点击在‘@’或者‘网址’之外的地方时,要响应LivtView的item click事件。TextView的高亮是使用ClickableSpan实现的。

前提:

LivtView的item click事件我是通过item布局的最外层ViewGroup设置OnClickListener事件实现的。

TextView 是宽度是wrap_content。

存在的问题:

1、如果同时设置布局 item ViewGroup 和 TextView 的OnClickListener事件时,当点击TextView 文本高亮的地方时,会同时响应TextView 和ViewGroup 的点击事件。

2、如果单一设置ViewGroup 的OnClickListener事件时,当点击TextView 文本高亮能正确响应点击事件,但是当点击TextView 文本高亮的之外的地方(未高亮的文本),不响应ViewGroup点击事件。

解决办法:

TextView使用ClickableSpan 实现高亮时,需要使用到LinkMovementMethod

textView.setMovementMethod(LinkMovementMethod.getInstance());


那么,我们需要自定义一个LinkMovementMethod:

public class CustomLinkMovementMethod extends LinkMovementMethod{

@Override
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
boolean b = super.onTouchEvent(widget,buffer,event);
//解决点击事件冲突问题
if(!b && event.getAction() == MotionEvent.ACTION_UP){
ViewParent parent = widget.getParent();//处理widget的父控件点击事件
if (parent instanceof ViewGroup) {
return ((ViewGroup) parent).performClick();
}
}
return b;
}

public static CustomLinkMovementMethod getInstance() {
if (sInstance == null)
sInstance = new CustomLinkMovementMethod();

return sInstance;
}

private static CustomLinkMovementMethod sInstance;

}


最后记得给ViewGroup设置OnClickListener事件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息