2014-10-03 74 views
7

我有一個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

回答

5

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);