2012-01-02 10 views
11

का उपयोग करके केवल लंबे क्लिक कैसे पंजीकृत कर सकता हूं, मैं केवल क्लिक करने योग्य स्पेस में लिपटे टेक्स्ट पर क्लिक पंजीकृत करना चाहता हूं, यदि उन्हें 1 सेकंड से अधिक के लिए क्लिक किया गया हो। क्या इसे करने का कोई तरीका है? यदि नहीं, तो डबल क्लिक कैप्चर करना भी ठीक होगा।एंड्रॉइड में - मैं एक क्लिक करने योग्य स्पेन

यह अच्छा होगा अगर ऑनक्लिक विधि ने उस ईवेंट पर कब्जा कर लिया जिस पर क्लिक के बारे में कुछ मेटा डेटा था - तो क्लिक करें कि क्लिक की लंबाई कम होने पर मैं अनदेखा कर सकता हूं।

कोई सलाह?

धन्यवाद, विक्टर

उत्तर

1

मैं भी ऐसा ही करना चाहते हैं, केवल विधि जो मन में आता कस्टम MovementMethod LinkMovementMethod और कहा कि कहते हैं एक लंबे सार विधि क्लिक ClickableSpan के लिए एक स्थानापन्न की जगह वर्ग है। यह वास्तव में काफी सरल है:

  1. डाउनलोड एंड्रॉयड स्रोत और LinkMovementMethod और ClickableSpan वर्गों का पता लगाने
  2. जोड़ा सार विधि onLongClick()
  3. LinkMovementMethod से MyCustomLinkMovementMethod वर्ग जहां onTouchEvent तो अनुकूलित है बनाएं साथ ClickableSpan से MyCustomClickableSpan कक्षा बनाएं कि यह सही जगह पर MyCustomClickableSpan के ऑन लोंगक्लिक() को कॉल करता है
  4. LinkMovementMethod और ClickableSpan
के बजाय अपने कोड में नए वर्गों का उपयोग करें

EDIT: एक आकर्षण की तरह काम करता है। मैंने कुछ बेवकूफ गलतियां की हैं जैसे कि विभिन्न एंड्रॉइड संस्करण से LinkMovementMethod डाउनलोड करना और setSpan() में नई क्लिक करने योग्य स्पेस क्लास का उपयोग नहीं करना, लेकिन कुछ भी गंभीर नहीं है।

+0

वर्ष सवाल .. लेकिन मुझे आश्चर्य है कि अगर आप अभी भी इस कोड के आसपास है और कर सकते थे अपने ऑन टचवेन्ट को यहां पोस्ट करें .. – rupps

+0

कृपया ऑन टचवेन्ट – do01

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 का विस्तार करने के लिए उपयोग की जाती है, तो मुझे अपनी कक्षा का उपयोग करने के लिए इसे बदलने की आवश्यकता कैसे है? –

+0

मैंने longclickablespan को जोड़ा है, बस अपने टेक्स्ट की टेक्स्ट मूवमेंट विधि को LongClickMovementMethod.getInstance पर सेट करें और LongClickableSpans के लिए अपने क्लिक करने योग्य स्पेस को प्रतिस्थापित करें, अब एक ऑनलक्लिक विधि है! आशा करता हूँ की ये काम करेगा ! – rupps

+0

यह स्पर्श करने के बाद ही यह काम करता है। यदि आप इसे इस तरह से संशोधित कर सकते हैं कि यहां तक ​​कि यदि कुछ समय के लिए टचडाउन होता है तो 1 या 2 सेकेंड कहता है और यह आग से आग लगती है कि यह जवाब और अधिक भयानक होगा। – ashutiwari4

संबंधित मुद्दे