博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Android]解决ClickableSpan中点击后ListView中item的长按冲突的问题
阅读量:6036 次
发布时间:2019-06-20

本文共 2678 字,大约阅读时间需要 8 分钟。

以下内容为原创,转载请注明:

来自天天博客:

 

项目中碰到一个问题,情景是这样的:

有一个ListView,每个item中有一个TextView,这个TextView实现了LongClick事件,这个TextView中又添加了ClickableSpan,实现了方法onClick。

我的需求是点击ClickableSpan,则响应ClickableSpan事件;长按ClickableSpan效果跟长按TextView应该一样,都响应TextView的LongClick事件。

然而结果是点击ClickableSpan响应正常;但是长按ClickableSpan时问题出现了:TextView的长按事件响应了,ClickableSpan点击事件也响应了!

研究了一下代码,解决方法如下:

继承LinkMovementMethod,然后重写里面的onTouchEvent方法,在里面判断,如果当前是长按的状态,则不执行ClickableSpan的onClick事件:

package com.kanchufang.privatedoctor.util.spannableparser;import android.text.Layout;import android.text.Selection;import android.text.Spannable;import android.text.method.LinkMovementMethod;import android.text.style.ClickableSpan;import android.view.MotionEvent;import android.widget.TextView;/** * Author: wangjie * Email: tiantian.china.2@gmail.com * Date: 7/3/14. */public class LinkMovementClickMethod extends LinkMovementMethod{    private long lastClickTime;    private static final long CLICK_DELAY = 500l;    @Override    public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {        int action = event.getAction();        if (action == MotionEvent.ACTION_UP ||                action == MotionEvent.ACTION_DOWN) {            int x = (int) event.getX();            int y = (int) event.getY();            x -= widget.getTotalPaddingLeft();            y -= widget.getTotalPaddingTop();            x += widget.getScrollX();            y += widget.getScrollY();            Layout layout = widget.getLayout();            int line = layout.getLineForVertical(y);            int off = layout.getOffsetForHorizontal(line, x);            ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);            if (link.length != 0) {                if (action == MotionEvent.ACTION_UP) {                    if(System.currentTimeMillis() - lastClickTime < CLICK_DELAY){                        link[0].onClick(widget);                    }                } else if (action == MotionEvent.ACTION_DOWN) {                    Selection.setSelection(buffer,                            buffer.getSpanStart(link[0]),                            buffer.getSpanEnd(link[0]));                    lastClickTime = System.currentTimeMillis();                }                return true;            } else {                Selection.removeSelection(buffer);            }        }        return super.onTouchEvent(widget, buffer, event);    }    public static LinkMovementClickMethod getInstance(){        if(null == sInstance){            sInstance = new LinkMovementClickMethod();        }        return sInstance;    }    private static LinkMovementClickMethod sInstance;}

代码很简单,按住超过500ms,则认定为是长按,则不执行ClickableSpan的onClick

 

你可能感兴趣的文章
C#+QQEmail自动发送邮件
查看>>
[Hadoop]MapReduce多输出
查看>>
Android Activity详解(一)
查看>>
快准车服完成3000万元A+轮融资,年底将开始B轮融资
查看>>
让我去健身的不是漂亮小姐姐,居然是贝叶斯统计!
查看>>
MySQL 数据约束
查看>>
我的友情链接
查看>>
SERVLET容器简介与JSP的关系
查看>>
《服务器SSH Public Key认证指南》-补充
查看>>
我的友情链接
查看>>
Java break continue return 的区别
查看>>
算法(Algorithms)第4版 练习 1.3.4
查看>>
jquery easyUI checkbox复选项获取并传后台
查看>>
浅析NopCommerce的多语言方案
查看>>
设计模式之简单工厂模式
查看>>
C++中变量的持续性、链接性和作用域详解
查看>>
2017 4月5日上午
查看>>
Google Chrome开发者工具
查看>>
第一阶段冲刺报告(一)
查看>>
使用crontab调度任务
查看>>