2014-10-03 6 views
7

'un dokunmatik alanını genişletin HTML metnini ayarladığım bir TextView var. Bu metnin birçok bağlantısı var. Bir bağlantıya dokunduğunuzda, her zaman onClick yöntemini tetiklemez. Bu yüzden, ClickableSpan alanını genişletmeye çalışıyorum, böylece her zaman yanıt veriyor.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

özel bir MovementMethod oluşturmak, bu uzatmak: https://github.com/android/platform_frameworks_base/blob/ usta/çekirdek/java/android/text/method/LinkMovementMethod.java – pskink

+0

gerçekten bana yardımcı oldu! çok teşekkürler! – Odys

+0

hoşgeldiniz ... – pskink

cevap

5

CustomMovementMethod ScrollingMovementMethod genişletmek ve onTouchEvent yöntemini geçersiz zorundadır. Fazladan bir alan eklemek için, bunları sizin boyutlarınızda tanımlamanız ve bunu başlangıç ​​/ bitiş aralığında kullanmanız gerekir. Böyle özel bağlantı hareketi çağırabilir

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