2012-01-02 9 views
11

bir ClickableSpan kullanarak sadece uzun tıklamaları kayıt nasıl üzerinde 1 saniye demek. Bunu yapmanın bir yolu var mı? Değilse, çift tıklama da iyi olurdu. Sonra tıklama uzunluğu kısa olsaydı görmezden söyleyebiliriz - onClick metodu tıklama hakkında bazı meta veri vardı bir olay yakalanan eğer- ben onlar için tıklandığında, eğer yalnızca ClickableSpan sarılmış bir metin üzerinde tıklamaları kayıt etmek istiyorum

harika olurdu.

Herhangi bir öneri?

sayesinde Victor

cevap

1

ben aynı şeyi istiyoruz, akla gelen tek yöntem özel LinkMovementMethod ve uzun soyut yöntem tıklayın ekleyen ClickableSpan yerine birini yerine MovementMethod sınıftır. Aslında oldukça basit:

  1. İndir Android kaynak ve LinkMovementMethod ve ClickableSpan sınıfların yerini
  2. onTouchEvent böylece özelleştirilmiştir LinkMovementMethod gelen MyCustomLinkMovementMethod sınıf oluşturun
  3. eklendi soyut yöntem onLongClick() ile ClickableSpan gelen MyCustomClickableSpan sınıf oluşturun doğru yerde
  4. Kullanım yılında MyCustomClickableSpan en onLongClick() çağrıları yerine
LinkMovementMethod ve ClickableSpan senin kodunda yeni sınıflar

DÜZENLEME: Bir cazibe gibi çalışır. Farklı Android sürümünden LinkMovementMethod indirip setSpan() yeni ClickableSpan sınıfını kullanarak değil, ama ciddi bir şey gibi bazı aptalca hatalar yaptık. vaka herkes ihtiyacı içinde

+0

eski soruya .. ama hala etrafta bu kodu varsa merak ve could burada OnTouchEvent sonrası .. – rupps

+0

lütfen OnTouchEvent – do01

9

, ben aynı yerde 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 buldum:

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

Hi bazı kod, bu örnek için teşekkürler. Sınıfım ClickableSpan'ı genişletmek için kullanılıyorsa, sınıfınızı kullanmak için şimdi nasıl değiştirmem gerekiyor? –

+0

i ekledik longclickablespan, sadece LongClickMovementMethod.getInstance için TextView'un metin hareketi yöntemini ayarlamak ve şimdi onLongClick yöntemine sahip daha LongClickableSpans için ClickableSpans yerine! Umarım yardımcı olur ! – rupps

+0

Sadece dokunuşu bıraktıktan sonra çalışır. Eğer bunu, eğer belirli bir süre için kontaksa bile 1 ya da 2 saniye dese ve olay patlatsa bile, bu cevabı daha müthiş hale getirecek şekilde değiştirebilirsiniz. lastClickTime = System.currentTimeMillis() '' sonra; i an android değilim – ashutiwari4

İlgili konular