zoukankan      html  css  js  c++  java
  • LinkMovementMethod「解决点击ClickableSpan触发view点击事件」

    上一篇写过自定义展开收起的textview,不过最近发现有个问题。

    那就是在列表页中,如果点击了全部,会触发view的点击事件,导致展开后接着进入了详情。

    这显然不是想要的结果。

    这里可以通过自定义LinkMovementMethod来解决。

    第一步:

    首先先屏蔽掉view的点击事件,全部用逻辑控制。

    这样的话,就只会响应ClickableSpan事件了。

    第二步:

    接下来就需要通过LinkMovementMethod来控制了。

    点进去看LinkMovementMethod的代码,可以看到是在onTouchEvent中处理的。

    参数中的textview就是我们的自定义展开收起view。

        @Override
        public boolean onTouchEvent(TextView widget, Spannable buffer,
                                    MotionEvent event) {
    
            if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN) {
                ...
                ClickableSpan[] links = buffer.getSpans(off, off, ClickableSpan.class);
    
                if (links.length != 0) {
                    ClickableSpan link = links[0];
                    if (action == MotionEvent.ACTION_UP) {
                        if (link instanceof TextLinkSpan) {
                            ((TextLinkSpan) link).onClick(
                                    widget, TextLinkSpan.INVOCATION_METHOD_TOUCH);
                        } else {
                            link.onClick(widget);
                        }
                    } else if (action == MotionEvent.ACTION_DOWN) {
                        Selection.setSelection(buffer,
                                buffer.getSpanStart(link),
                                buffer.getSpanEnd(link));
                    }
                    return true;
                } else {
                    Selection.removeSelection(buffer);
                }
            }
            return super.onTouchEvent(widget, buffer, event);
        }

    现在就是要改变这里的逻辑,我这里直接把这个类复制出来,然后其它不变,直接处理这块逻辑。

             if (links.length != 0) {
                    if (action == MotionEvent.ACTION_UP) {
                        links[0].onClick(widget);
                    } else if (action == MotionEvent.ACTION_DOWN) {
                        Selection.setSelection(buffer,
                                buffer.getSpanStart(links[0]),
                                buffer.getSpanEnd(links[0]));
                    }
                    //Log.e("onTouchEvent","点击了tip");
                    return true;
                } else {
                    if (action == MotionEvent.ACTION_UP) {//防止滑动触发
                        //Log.e("onTouchEvent", "点击了其它");
                        Selection.removeSelection(buffer);
                        widget.performClick();
                        return super.onTouchEvent(widget, buffer, event);
                    }
                }
            }
            //Log.e("onTouchEvent","onTouchEvent");
            return super.onTouchEvent(widget, buffer, event);

    上面的 widget.performClick() 就是触发了view的点击事件,这里就可以随意控制点击事件了。

    在设置span的时候添加进去就行了。

    看运行效果图,非常丝滑,正常滑动,点击,展开。

  • 相关阅读:
    PHP后门新玩法:一款猥琐的PHP后门分析
    中国菜刀批量导出数据
    渗透测试:反弹与转发小结
    怎样用Java自制优秀的图片验证码?这样!
    6条 Tips 为你照亮 GitHub 寻宝之路
    如何搭建一个“不可告人的”私人专属网盘?教程拿去
    6个炫酷又好用的 Python 工具,个个都很奔放呀
    20个Java练手项目,献给嗜学如狂的人
    如何自己动手写一个搜索引擎?我是一份害羞的教程🙈
    GitHub上个最有意思的项目合集(技术清单系列)
  • 原文地址:https://www.cnblogs.com/LiuZhen/p/15157754.html
Copyright © 2011-2022 走看看