2012-01-02 50 views
11

Tôi muốn đăng ký lần nhấp vào văn bản được bao bọc trong ClickableSpan chỉ khi chúng được nhấp trong hơn 1 giây. Có cách nào để làm điều này không? Nếu không, việc chụp một nhấp đúp cũng sẽ ổn. Nó sẽ là tuyệt vời nếu phương pháp onClick bắt một sự kiện có một số dữ liệu meta về nhấp chuột - sau đó tôi có thể nói bỏ qua nếu độ dài nhấp chuột ngắn.Trong Android - Làm cách nào tôi có thể đăng ký chỉ các nhấp chuột dài bằng cách sử dụng ClickableSpan

Bạn có lời khuyên nào không?

Cảm ơn, Victor

Trả lời

1

Tôi muốn làm như vậy, phương pháp duy nhất mà đến với tâm là tùy chỉnh lớp MovementMethod thay thế LinkMovementMethod và một sự thay thế cho ClickableSpan có thêm một chặng đường dài nhấp phương pháp trừu tượng. Nó thực sự là khá đơn giản:

  1. Tải về mã nguồn Android và xác định vị trí các lớp LinkMovementMethod và ClickableSpan
  2. Tạo lớp MyCustomClickableSpan từ ClickableSpan với thêm phương pháp trừu tượng onLongClick()
  3. Tạo lớp MyCustomLinkMovementMethod từ LinkMovementMethod nơi onTouchEvent được tùy chỉnh để rằng nó gọi MyCustomClickableSpan's onLongClick() ở đúng nơi
  4. Sử dụng các lớp mới trong mã của bạn thay vì LinkMovementMethod và ClickableSpan

EDIT: Hoạt động như một sự quyến rũ. Tôi đã thực hiện một số sai lầm ngu ngốc như tải về LinkMovementMethod từ phiên bản Android khác nhau và không sử dụng lớp ClickableSpan mới trong setSpan(), nhưng không có gì nghiêm trọng.

+0

câu hỏi cũ .. nhưng tôi tự hỏi, nếu bạn vẫn còn có mã này xung quanh và có thể đăng OnTouchEvent của bạn ở đây .. – rupps

+0

vui lòng một số mã cho OnTouchEvent – do01

9

Trong trường hợp bất cứ ai cần nó, tôi thấy nó trên 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 trong cùng một vị trí:

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

Xin chào, Cảm ơn ví dụ này. Nếu lớp học của tôi sử dụng để mở rộng ClickableSpan, làm thế nào để tôi cần phải thay đổi nó ngay bây giờ để sử dụng lớp học của bạn? –

+0

Tôi đã thêm longclickablespan, chỉ cần đặt phương thức di chuyển văn bản của textView thành LongClickMovementMethod.getInstance và thay thế ClickableSpans của bạn cho LongClickableSpans, hơn bây giờ có phương thức onLongClick! Hy vọng nó giúp ! – rupps

+0

Chỉ hoạt động sau khi bạn nhả cảm ứng. Nếu bạn có thể sửa đổi nó theo cách như vậy mà ngay cả khi có touchdown cho thời gian nhất định nói 1 hoặc 2 giây và nó cháy sự kiện này sẽ làm cho câu trả lời này tuyệt vời hơn. – ashutiwari4

Các vấn đề liên quan