TextView的内部链接支持长按

原创 2015年07月09日 16:27:27

先创建一个支持处理长按事件的span

public class LongClickableSpan extends ClickableSpan View.OnClickListener l;{
    View.OnClickListener l;
    OnLongClickListener mOnLongClickListener = null;

    public LongClickableSpan(String text, OnClickListener l, OnLongClickListener ll, Context mContext) {
        super(text, l, mContext);
        mOnLongClickListener = ll;
    }

    @Override
    public void onClick(View v) {
        if (l != null) {
            l.onClick(v);
        }
    }

    public void onLongClick(View view) {
        if (mOnLongClickListener != null) {
            mOnLongClickListener.onLongClick(view);
        }
    }
}

再重写一个LinkMovementMethod

public class LongClickLinkMovementMethod extends LinkMovementMethod {
    private static LongClickLinkMovementMethod sInstance;
    private static int LONG_CLICK_TIME = 1000;
    private Long lastClickTime = 0l;
    private int lastX = 0;
    private int lastY = 0;
    // 本次点击是否已相应长按事件
    private boolean LongClickCalled = false;

    public static LinkMovementMethod getInstance() {
        if (sInstance == null) {
            sInstance = new LongClickLinkMovementMethod();
        }
        return sInstance;
    }

    @Override
    public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
        int action = event.getAction();
        if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_DOWN || action == MotionEvent.ACTION_MOVE) {
            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 (!LongClickCalled) {
                        link[0].onClick(widget);
                    }
                    LongClickCalled = false;
                } else if (action == MotionEvent.ACTION_DOWN) {
                    Selection.setSelection(buffer, buffer.getSpanStart(link[0]), buffer.getSpanEnd(link[0]));
                    lastClickTime = System.currentTimeMillis();
                } else if (action == MotionEvent.ACTION_MOVE) {
                    long delta = System.currentTimeMillis() - lastClickTime;
                    if (delta > LONG_CLICK_TIME && !LongClickCalled && deltaX < 10 && deltaY < 10) {
                        LongClickCalled = true;
                        link[0].onLongClick(widget);
                    }
                }
                return true;
            }
        } else if (action == MotionEvent.ACTION_CANCEL) {
            LongClickCalled = false;
        }

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

}

使用代码:

TextView textView;
textView.setText(text);//此处text内加入LongClickableSpan的配置
textView.setMovementMethod(LongClickLinkMovementMethod.getInstance());


android屏蔽长按 网址的Textview跳转访问网页

比如我们的Textview里面的内容是网址 http;//www.baidu.com,然后我们设置了textview的属性android:autoLink="web",这样之后,我们点击textvie...
  • ctluo111
  • ctluo111
  • 2016年04月13日 15:54
  • 1657

iOS7 textView处理URL链接 以及点击 长按手势的处理

举例1 :文本超链接 @property (weak, nonatomic) IBOutlet UITextView *tv;     NSMutableAttribut...
  • Lw_Chen
  • Lw_Chen
  • 2015年10月10日 16:59
  • 2468

Android自定义TextView链接点击和长按事件

Android自定义TextView链接点击和长按事件标签(空格分隔): Android由于有个需求,就是点文本中超链接(电话,网址email等)直接跳转,长按弹出菜单menu;由于API只提供了超链...
  • fenggit
  • fenggit
  • 2015年09月01日 18:20
  • 2239

Android TextView长按复制文本

其实现在新的Android开发只需要增加一行代码就可以实现这个功能,在布局文件的TextView控件属性中增加这么一句就行:android:textIsSelectable="true"      ...
  • u013164293
  • u013164293
  • 2016年05月03日 10:42
  • 1035

TextView长按复制实现方法小结

有这么一个需求,用户在浏览文本信息时希望长按信息就能弹出复制的选项方便保存或者在别的页面使用这些信息.类似的, 就像长按WebView或者EditText的内容就自动弹出复制选项. 这里面主要是2个特...
  • stzy00
  • stzy00
  • 2014年11月25日 10:23
  • 12434

TextView 借助Linkify,使用自定义模式设置链接

TextView是android中的一个比较常用的控件,它有一个非常有趣的特性,可以通过android:autoLink设置某些模式,使得textView文本中匹配这个模式的文本段成为可点链接。and...
  • xiaoluoli88
  • xiaoluoli88
  • 2014年10月22日 10:39
  • 581

自定义TextView处理任意时间长按短按的事件

import android.content.Context; import android.util.AttributeSet; import android.util.Log; import an...
  • u013571833
  • u013571833
  • 2016年08月25日 16:40
  • 475

Android textview 实现长按自由选择复制功能

这里有一个大坑,我的viewGroup中有一个这个属性android:descendantFocusability=”blocksDescendants”开始没有注意到,试了好多方法都不行,后来才看到...
  • qq_33200652
  • qq_33200652
  • 2017年01月08日 23:08
  • 4161

Android TextView 长按复制到剪切板,粘贴

和Window系统一样,Android也有剪切板(ClipboardManager)。 对应的类: API 11之前: android.text.ClipboardManager A...
  • asdf717
  • asdf717
  • 2016年09月27日 09:51
  • 3142

TextView的长按复制(高仿微信文字复制粘贴)

在适配器里面写以下代码,原理就是给TextView设置长按点击事件,然后复制到剪切板上(ClipboardManager) 导入包   import android.text.ClipboardMan...
  • ht1063899049
  • ht1063899049
  • 2017年06月22日 16:02
  • 580
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:TextView的内部链接支持长按
举报原因:
原因补充:

(最多只允许输入30个字)