2014-10-03 8 views
7

Ich habe eine TextView, in der ich HTML-Text festlegen. Dieser Text enthält viele Links. Wenn Sie auf einen Link tippen, löst dies nicht immer die onClick-Methode aus. Also versuche ich den Bereich von ClickableSpan zu erweitern, so dass es immer reaktionsfähig ist.Erweitern Sie den Touchbereich von 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

erstellen Sie eine benutzerdefinierte MovementMethod, erweitern diese: https://github.com/android/platform_frameworks_base/blob/ Master/Core/Java/Android/Text/Methode/LinkMovementMethod.java – pskink

+0

das hat mir wirklich geholfen! Danke vielmals! – Odys

+0

Sie sind willkommen ... – pskink

Antwort

5

Die CustomMovementMethod hat ScrollingMovementMethod zu verlängern und die onTouchEvent Methode überschreiben. Um zusätzlichen Speicherplatz hinzuzufügen, müssen Sie ihn in Ihren Dimensionen definieren und im Start-/Endbereich verwenden.

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

}

Sie Ihre benutzerdefinierten Link Bewegung wie folgt aufrufen können:

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