2014-11-08 13 views
5

मुझे एक क्लिक करने योग्य अवधि की आवश्यकता होती है ताकि मेरे ऐप में एक सामान्य क्लिक और लंबी क्लिक विधियां हो और मुझे पता चला कि (In Android - How can I register only long clicks using a ClickableSpan) कि मैं LinkMovementMethod क्लास का विस्तार कर सकता हूं और क्लिक करने योग्य एसपीएन क्लास ऐसा करने की अनुमति देने के लिए, लेकिन वर्तमान में लंबे और छोटे क्लिक दोनों काम करते हैं, लेकिन लंबी क्लिक एक्शन को फायर करने के बजाए लंबे क्लिक के लिए जब आइटम को लंबे समय तक दबाया जाता है तो यह तब तक इंतजार करेगा जब तक आप आइटम को आग में नहीं छोड़ देते। यहाँ विस्तारित वर्गों के लिए मेरे कोड है:क्लिक करने योग्य अवधि पर लंबे समय तक क्लिक नहीं किया जाता है जब तक कि क्लिक जारी नहीं किया जाता है

LinkMovementClass

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

LongClickableSpanClass

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

public abstract class LongClickableSpan extends ClickableSpan { 

    abstract public void onLongClick(View view); 
} 

वास्तविक क्रियान्वयन

LongClickableSpan eruptionText = new LongClickableSpan() { 

           @Override 
           public void onClick(View tvEruptions) { 
            LinkFunctions.link_eruption_detail(getApplicationContext(),PostErupionID); 
           } 

           @Override 
           public void onLongClick(View tvEruptions) { 
            if(SignedInUserID != 0) { 
             DialogFragment newFragment = new Dialogs.QuickActionsDialogFragment(); 
             // Supply num input as an argument. 
             Bundle args = new Bundle(); 
             args.putLong("eruptionID", PostErupionID); 
             newFragment.setArguments(args); 
             newFragment.show(getFragmentManager(), "QuickActions"); 
            } 
           } 

          }; 
          ss.setSpan(eruptionText, startpos[(int) j], endpos[(int) j], Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 

उत्तर

5

मैं जानता हूँ कि इस सवाल पुराना है और शायद ओपी पहले से ही समस्या को हल किया है, लेकिन मैं आग के बाद समय है जब हम नल जारी करने के बजाय बीत चुका है मूल LongClickLinkMovementMethod पर कुछ सुधार किया: तो मूल रूप से

import android.os.Handler; 
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 Handler mLongClickHandler; 
    private static int LONG_CLICK_TIME = 1000; 
    private boolean mIsLongPressed = false; 

    @Override 
    public boolean onTouchEvent(final TextView widget, Spannable buffer, 
           MotionEvent event) { 
     int action = event.getAction(); 

     if(action == MotionEvent.ACTION_CANCEL){ 
      if(mLongClickHandler!=null){ 
       mLongClickHandler.removeCallbacksAndMessages(null); 
      } 
     } 

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

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

      if (link.length != 0) { 
       if (action == MotionEvent.ACTION_UP) { 
        if(mLongClickHandler!=null){ 
         mLongClickHandler.removeCallbacksAndMessages(null); 
        } 
        if(!mIsLongPressed) { 
         link[0].onClick(widget); 
        } 
        mIsLongPressed = false; 
       } else { 
        Selection.setSelection(buffer, 
          buffer.getSpanStart(link[0]), 
          buffer.getSpanEnd(link[0])); 
        mLongClickHandler.postDelayed(new Runnable() { 
         @Override 
         public void run() { 
          link[0].onLongClick(widget); 
          mIsLongPressed = true; 
         } 
        },LONG_CLICK_TIME); 
       } 
       return true; 
      } 
     } 

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


    public static MovementMethod getInstance() { 
     if (sInstance == null) { 
      sInstance = new LongClickLinkMovementMethod(); 
      sInstance.mLongClickHandler = new Handler(); 
     } 

     return sInstance; 
    } 
    private static LongClickLinkMovementMethod sInstance; 
} 

यह 1000ms

3

View.setTag का उपयोग करने का सरल तरीका है।

कोड उदाहरण:

tv.setOnLongClickListener(new OnLongClickListener() { 

    @Override 
    public boolean onLongClick(View v) { 
     Toast.makeText(getApplicationContext(), "onLongClick", Toast.LENGTH_SHORT).show(); 
     v.setTag("Test"); 
     return true; 
    } 
}); 

private static class NonLongClickableUrlSpan extends URLSpan { 

    public NonLongClickableUrlSpan(String url) { 
     super(url); 
    } 

    @Override 
    public void onClick(View widget) { 
     if (widget.getTag() != null) { 
      widget.setTag(null); 
      return; 
     } 
     super.onClick(widget); 
    } 
} 
संबंधित मुद्दे

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