Android TextView Linkify 拦截与父View手势

标签 android gesture linkify

问题是,如果我 Linkify textView underliyng ScrollView 不会听我设置的扫描手势。有没有办法在不弄乱 underliyng View 的手势的情况下进行 Linkify? 我试图覆盖 ontouchEvent 并将 false 返回给 ACTION_MOVE 但 ScrollView 的手势需要 ACTION_DOWN 和 ACTION_UP 事件才能起作用。有办法实现吗?

最佳答案

Linkify 将 movementMethod 应用于 textView LinkMovementMethod。该移动方法认为它实现了一个垂直滚动方法,它覆盖了父级拥有的任何其他滚动方法。尽管可以将 touchEvent 分派(dispatch)给父级,但特定的父级 ScrollView 需要整个序列 ACTION_DOWN , ACTION_MOVE, ACTION_UP 执行(扫描检测)。

所以我的问题的解决方案是在 Linkify 之后删除 textView 的滚动方法,并在 textView 的 onTouchEvent 中处理 LinkMovementMethod 链接检测 Action 。

@override
public boolean onTouchEvent(MotionEvent event) {
        TextView widget = (TextView) this;
        Object text = widget.getText();
        if (text instanceof Spanned) {
            Spannable buffer = (Spannable) text;

            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) {
                        link[0].onClick(widget);
                    } else if (action == MotionEvent.ACTION_DOWN) {
                         Selection.setSelection(buffer,
                                 buffer.getSpanStart(link[0]),
                                 buffer.getSpanEnd(link[0]));
                    }
                    return true;
                }
            }

        }

        return false;
    }

这样我就有了 Link_Click 检测(仅在用户触摸链接而不是整个 TextView 时执行)并且我没有整个 LinkMovementMethod。

关于Android TextView Linkify 拦截与父View手势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7236840/

相关文章:

android - ItemDecoration - 如何创建垂直分隔线?

当我将 Java android SurfaceView 传递给另一个类构造函数时,它变为 null

android - 以编程方式更改工具栏主题

iOS >> 如何识别用户离开 UISlider Thumb 属性的手势?

android - 让手势落入 Android 上的不同 View

Android: java.lang.UnsatisfiedLinkError: dlopen failed: libwebviewchromium.so 是 32 位而不是 64 位

java - Android Linkify - 可点击的电话号码

android - 让 TableView 和 ListView 占据整个屏幕宽度

android检测用户是否滑动

java - 使用 Linkify.addLinks 结合 Html.fromHtml