以下內容為原創,轉載請注明:
來自天天博客:http://www.cnblogs.com/tiantianbyconan/p/3823429.html
項目中碰到一個問題,情景是這樣的:
有一個ListView,每個item中有一個TextView,這個TextView實現了LongClick事件,這個TextView中又添加了ClickableSpan,實現了方法onClick。
我的需求是點擊ClickableSpan,則響應ClickableSpan事件;長按ClickableSpan效果跟長按TextView應該一樣,都響應TextView的LongClick事件。
然而結果是點擊ClickableSpan響應正常;但是長按ClickableSpan時問題出現了:TextView的長按事件響應了,ClickableSpan點擊事件也響應了!
研究了一下代碼,解決方法如下:
繼承LinkMovementMethod,然后重寫里面的onTouchEvent方法,在里面判斷,如果當前是長按的狀態,則不執行ClickableSpan的onClick事件:
package com.kanchufang.privatedoctor.util.spannableparser; import android.text.Layout; import android.text.Selection; import android.text.Spannable; import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; import android.view.MotionEvent; import android.widget.TextView; /** * Author: wangjie * Email: tiantian.china.2@gmail.com * Date: 7/3/14. */ public class LinkMovementClickMethod extends LinkMovementMethod{ private long lastClickTime; private static final long CLICK_DELAY = 500l; @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) { if(System.currentTimeMillis() - lastClickTime < CLICK_DELAY){ link[0].onClick(widget); } } else if (action == MotionEvent.ACTION_DOWN) { Selection.setSelection(buffer, buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0])); lastClickTime = System.currentTimeMillis(); } return true; } else { Selection.removeSelection(buffer); } } return super.onTouchEvent(widget, buffer, event); } public static LinkMovementClickMethod getInstance(){ if(null == sInstance){ sInstance = new LinkMovementClickMethod(); } return sInstance; } private static LinkMovementClickMethod sInstance; }
代碼很簡單,按住超過500ms,則認定為是長按,則不執行ClickableSpan的onClick