展开ClickableSpan的触摸区域

问题描述:

我有一个TextView,我在其中设置HTML文本。本文有很多链接。点击链接时,并不总是触发onClick方法。所以,我正在尝试扩展ClickableSpan的区域,以便始终保持响应。展开ClickableSpan的触摸区域

int start = strBuilder.getSpanStart(span); 
int end = strBuilder.getSpanEnd(span); 
int flags = strBuilder.getSpanFlags(span); 
final ClickableSpan clickable = new ClickableSpan() { 
    public void onClick(View view) { 
    getTouchActions(span.getURL()); 
    } 
}; 
strBuilder.setSpan(clickable, start, end, flags); 
strBuilder.removeSpan(span); 
+1

创建自定义MovementMethod延长本:https://github.com/android/platform_frameworks_base/blob/ master/core/java/android/text/method/LinkMovementMethod.java – pskink 2014-10-03 13:56:24

+0

真的帮助了我!非常感谢! – Odys 2014-10-06 16:56:55

+0

欢迎您... – pskink 2014-10-06 16:57:54

CustomMovementMethod必须扩展ScrollingMovementMethod并重写onTouchEvent方法。为了添加一些额外的空间,你必须在你的尺寸中定义它,并在开始/结束跨度中使用它。

@Override 
    public boolean onTouchEvent(TextView widget, Spannable buffer, 
           MotionEvent event) { 
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); 

    int startSpan = off - context.getResources().getDimension(R.dimen.extra_space_start); 
    int endSpan = off + context.getResources().getDimension(R.dimen.extra_space_end); 

    ClickableSpan[] link = buffer.getSpans(startSpan, endSpan, 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; 
    } else { 
    Selection.removeSelection(buffer); 
    } 
} 

return super.onTouchEvent(widget, buffer, event); 

}

你可以叫你的自定义链接运动是这样的:

textView.setMovementMethod(new CustomLinkMovementMethod(context)); 
textView.setLinksClickable(true);