2012-01-02 27 views
11

我想在裹着ClickableSpan文本,只有當他們被點擊時的點擊次數僅長點擊次數的說1秒。有沒有辦法做到這一點?如果沒有,捕獲雙擊也可以。在Android中 - 我如何註冊使用ClickableSpan

這將是巨大的,如果OnClick方法捕獲的,關於該點擊一些元數據的事件 - 那麼我可以說忽略,如果點擊的長度很短。

有什麼建議嗎?

謝謝,維克多

回答

1

我想要做的一樣,出現在腦海的唯一方法就是自定義MovementMethod類取代LinkMovementMethod和ClickableSpan更換,增加了一個長單擊抽象方法。其實原因很簡單:

  1. 下載Android源碼,並找到LinkMovementMethod和ClickableSpan類
  2. 創建一個從ClickableSpan添加了抽象方法onLongClick()
  3. 創建一個從LinkMovementMethod MyCustomLinkMovementMethod所在班級的onTouchEvent定製這樣MyCustomClickableSpan類它在正確的地方
  4. 使用要求MyCustomClickableSpan的onLongClick()新課程在你的代碼,而不是LinkMovementMethod和ClickableSpan

編輯:工程就像一個魅力。我做了一些愚蠢的錯誤,像從不同的Android版本下載LinkMovementMethod,而不是在setSpan()中使用新的ClickableSpan類,但沒有什麼嚴重的。

+0

老問題..但我不知道如果你仍然有解決這個代碼,並可能在這裏發表您的onTouchEvent .. – rupps 2013-12-06 22:30:54

+0

請對的onTouchEvent – do01 2016-06-25 10:37:15

9

萬一有人需要它,我在同一個地方發現它this place

package leeon.mobile.BBSBrowser; 

    import android.text.Layout; 
    import android.text.Selection; 
    import android.text.Spannable; 
    import android.text.method.LinkMovementMethod; 
    import android.text.method.MovementMethod; 
    import android.view.MotionEvent; 
    import android.widget.TextView; 

    public class LongClickLinkMovementMethod extends LinkMovementMethod { 

     private Long lastClickTime = 0l; 
     private int lastX = 0; 
     private int lastY = 0; 
     @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(); 
       lastX = x; 
       lastY = y; 
       int deltaX = Math.abs(x-lastX); 
       int deltaY = Math.abs(y-lastY); 

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

       LongClickableSpan[] link = buffer.getSpans(off, off, LongClickableSpan.class); 

       if (link.length != 0) { 
        if (action == MotionEvent.ACTION_UP) { 
         if (System.currentTimeMillis() - lastClickTime < 1000) 
         link[0].onClick(widget); 
         else if (deltaX < 10 && deltaY < 10) 
         link[0].onLongClick(widget); 
        } else if (action == MotionEvent.ACTION_DOWN) { 
         Selection.setSelection(buffer, 
               buffer.getSpanStart(link[0]), 
               buffer.getSpanEnd(link[0])); 
         lastClickTime = System.currentTimeMillis(); 
        } 
        return true; 
       } 
      } 

      return super.onTouchEvent(widget, buffer, event); 
     } 


     public static MovementMethod getInstance() { 
      if (sInstance == null) 
       sInstance = new LongClickLinkMovementMethod(); 

      return sInstance; 
     } 

     private static LongClickLinkMovementMethod sInstance; 
    } 


     [1]: http://java2s.com/Open-Source/Java/SSH/brick-leeon/leeon/mobile/BBSBrowser/LongClickLinkMovementMethod.java.htm 

LongClickableSpan:

package leeon.mobile.BBSBrowser; 

    import android.text.style.ClickableSpan; 
    import android.view.View; 

    public abstract class LongClickableSpan extends ClickableSpan { 

     abstract public void onLongClick(View view); 

    } 
+0

在某些代碼,感謝這個例子。如果我的課程用於擴展ClickableSpan,那麼現在如何改變它以使用您的課程? – 2014-01-02 12:58:28

+0

我已經添加longclickablespan,只需設置你的TextView到LongClickMovementMethod.getInstance的文本運動方法和替換您ClickableSpans爲LongClickableSpans,比現在有一個onLongClick方法!希望能幫助到你 ! – rupps 2014-01-15 00:14:07

+0

只有在您鬆開觸摸後才能使用。如果你可以修改它,即使有一定的時間,例如1秒或2秒的觸地點,它會觸發事件將使這個答案更真棒。 – ashutiwari4 2015-09-11 07:47:38

相關問題