问题是,如果我 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/