TextView ClickableSpan onClickListener点击事件冲突

需求是这样的:

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事件。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值