问题是,如果我链接 textView 下的 ScrollView 不听我设置的扫描手势。有没有办法让 Linkify 不弄乱下视图的手势?我试图覆盖 ontouchEvent 并将 false 返回给 ACTION_MOVE 但滚动视图的手势需要 ACTION_DOWN 和 ACTION_UP 事件才能起作用。有没有办法做到这一点?
3 回答
Linkify
适用于 textView 的移动方法LinkMovementMethod
。该移动方法认为它实现了垂直滚动方法,它覆盖了父级拥有的任何其他滚动方法。虽然 touchEvent
可以分派给父级,但特定的父级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;
}
这样我就有了 Link_Click 检测(仅在用户触摸链接而不是整个 textview 时执行)并且我没有整个 LinkMovementMethod。
@weakwire 和 @Ridicully 的答案是正确的。我刚刚创建了一个可以在项目中重复使用的小要点。
这是链接:https ://gist.github.com/amilcar-andrade/e4b76840da1dc92febfc
TextView::setText(...) 方法利用 autoLink 标志有一个小坏处,
if (mAutoLinkMask != 0) {
Spannable s2;
if (type == BufferType.EDITABLE || text instanceof Spannable) {
s2 = (Spannable) text;
} else {
s2 = mSpannableFactory.newSpannable(text);
}
if (Linkify.addLinks(s2, mAutoLinkMask)) {
text = s2;
type = (type == BufferType.EDITABLE) ? BufferType.EDITABLE : BufferType.SPANNABLE;
/*
* We must go ahead and set the text before changing the
* movement method, because setMovementMethod() may call
* setText() again to try to upgrade the buffer type.
*/
mText = text;
// Do not change the movement method for text that support text selection as it
// would prevent an arbitrary cursor displacement.
if (mLinksClickable && !textCanBeSelected()) {
setMovementMethod(LinkMovementMethod.getInstance());
}
}
}
所以我花了一些时间来理解,为什么我在ListView项中禁用链接,但它有时会获得一个链接!
您需要将该标志设置为所需的值,然后调用 setText(...)