Android TextView Linkify拦截父视图手势

wea*_*ire 8 android gesture linkify

问题是,如果我链接textView,underLyng ScrollView不会听我设置的扫描手势.有没有办法让Linkify不会搞乱underliyng视图的手势?我试图覆盖ontouchEvent并将false返回给ACTION_MOVE,但是scrollview的手势需要ACTION_DOWN和ACTION_UP事件才能运行.有没有办法实现这一目标?

wea*_*ire 47

Linkify适用于textView的movementMethod LinkMovementMethod.该运动方法认为它实现了一个垂直滚动方法,它覆盖了父有的任何其他滚动方法.虽然 touchEvent可以dispached到母体,所述特定父ScrollView所需的整个序列ACTION_DOWN,ACTION_MOVE,ACTION_UP以执行(扫描检测).

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

@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;
    }
Run Code Online (Sandbox Code Playgroud)

这种方式我有Link_Click检测(仅在用户触摸链接而不是整个textview时执行)并且我没有整个LinkMovementMethod.

  • 提到的"删除textView的滚动方法"是通过`textView.setMovementMethod(null);`来完成的,并且必须调用_after_你已经设置了textView的文本. (2认同)