使用setMovementMethod才能使TextView里面的元素自動擁有點擊功能,支持ClickSpan。但是加上這個方法會造成ListView的每個項無的文本會占用ListView的ItemClick,解決這個辦法需要重寫一個setMovementMethod方法,詳見代碼如下:
public class TextViewFixTouchConsume extends TextView { boolean dontConsumeNonUrlClicks = true; boolean linkHit; public TextViewFixTouchConsume(Context context) { super(context); } public TextViewFixTouchConsume(Context context, AttributeSet attrs) { super(context, attrs); } public TextViewFixTouchConsume(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @Override public boolean onTouchEvent(MotionEvent event) { linkHit = false; boolean res = super.onTouchEvent(event); if (dontConsumeNonUrlClicks) return linkHit; return res; } public void setTextViewHTML(String html) { CharSequence sequence = Html.fromHtml(html); SpannableStringBuilder strBuilder = new SpannableStringBuilder(sequence); setText(strBuilder); } public static class LocalLinkMovementMethod extends LinkMovementMethod{ static LocalLinkMovementMethod sInstance; public static LocalLinkMovementMethod getInstance() { if (sInstance == null) sInstance = new LocalLinkMovementMethod(); return sInstance; } @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); 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])); } if (widget instanceof TextViewFixTouchConsume){ ((TextViewFixTouchConsume) widget).linkHit = true; } return true; } else { Selection.removeSelection(buffer); Touch.onTouchEvent(widget, buffer, event); return false; } } return Touch.onTouchEvent(widget, buffer, event); } } }
以上加紅的兩個代碼必須要重寫。隨后你就可以這么使用
setMovementMethod(TextViewFixTouchConsume.LocalLinkMovementMethod.getInstance());
這樣即給TextView增加點擊效果,又不讓其占用Item的點擊焦點。類似微博的@ 、表情、鏈接等。
最后發個圖,給大家參考