I put some ClickableSpan in EditText, unfortunately, that spans are still not clickable. When I click them, the only thing happened when I tap the clickablespan is the text cursor(selection, position, whatever you call it is) been set to that position.

After some search, I find out: I have to do this to make the span clickable?

setMovementMethod(LinkMovementMethod.getInstance());

After this, I do can click the ClickableSpan, but a new problem appear:

I can't do cursor selecting anymore, the cursor disappeared!

After a lot of searching and analyzing, I decide to make my own MovementMethod, which support both cursor selecting and span clicking. It's easy, the onTouchEvent() method is copied from android 1.5-r4 source code.

Here it goes:

Java语言: <ue_a href="http://fayaa.com/code/">高亮代码由发芽网提供

package my.handrite.text.method;

import android.text.Layout;
import android.text.Selection;
import android.text.Spannable;
import android.text.method.ArrowKeyMovementMethod;
import android.text.method.MovementMethod;
import android.text.style.ClickableSpan;
import android.view.MotionEvent;
import android.widget.TextView;

public class LinkArrowKeyMovementMethod extends ArrowKeyMovementMethod {
private static LinkArrowKeyMovementMethod mInstance;

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

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

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

if (link.length != 0) {
               if (action == MotionEvent.ACTION_UP) {
                   link[0].onClick(widget);
               } else if (action == MotionEvent.ACTION_DOWN) {
                   Selection.setSelection(buffer,
                                          buffer.getSpanStart(link[0]),
                                          buffer.getSpanEnd(link[0]));
               }

return true;
           } else {
               Selection.removeSelection(buffer);
           }
       }

return super.onTouchEvent(widget, buffer, event);
}
@Override
public String toString(){
return "my.handrite.text.method.ClickableArrowKeyMovementMethod";
}
   public static MovementMethod getInstance() {
       if (mInstance == null)
           mInstance = new LinkArrowKeyMovementMethod();

return mInstance;
   }
}

【转】edittext设置点击链接的更多相关文章

  1. 让超链接点击后不跳转,可以用href = "#",但是这个#就会锚点到页面最上边 点击链接后不跳转可以设置成

    让超链接点击后不跳转,可以用href = "#",但是这个#就会锚点到页面最上边     点击链接后不跳转可以设置成     1.<a href="javascri ...

  2. EditText设置可以点击,但是不可以编辑

    EditText设置  editText.setEnabled(false);后不可编辑也不可点击 设置  setFocusable(false)后不可编辑,但是再设置 setFocusable(tr ...

  3. 怎么用js设置a标签点击链接改变当前颜色

    怎么用js设置a标签点击链接改变当前颜色 20 例如:多个a标签为白色,当点击其中一个a标签时改变那一个a标签的字体颜色为黄色,并且跳转到对应链接,当点击下一个a标签链接时,下一个为黄色,之前一个恢复 ...

  4. HTML a标签链接 设置点击下载文件

    通常情况下,为文件添加链接后,用户可以通过点击链接,直接将文件下载到本地,如下载 excel 表格等 <a href="/user/test/xxxx.excel">点 ...

  5. c# webbrowser 随机点击链接

    HtmlElementCollection hec = webBrowser1.Document.All; ; i < hec.Count; i++) { if (hec[i].GetAttri ...

  6. ASP.Net Web 点击链接直接下载 不在浏览器打开

    目标是:用户点击链接直接弹出下载框,不在浏览器打开文件. 一般网站下载的功能,本以为直接把虚拟路径赋值给链接就行了,没想到测试的时候发现图片,文本和PDF格式的文件都自动在Firefox里面打开了,没 ...

  7. SEO -- WordPress怎设置百度站长链接自动提交

    百度站长平站更新了主动推送(实时)推送的方式,受到了广大站长的好评,但是对于使用WordPress的网站来说怎么设置自动提交呢,在这里介绍一种比较简单且有效的方法.我们可以使用 WP BaiDu Su ...

  8. 055——VUE中vue-router之路由参数的随意设置与伪静态链接地址处理:

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml) 用javascript在客户端删除某一个cookie键值对 input点击链接另一个页面,各种操作。 C# 往线程里传参数的方法总结 TCP/IP 协议 用C#+Selenium+ChromeDriver 生成我的咕咚跑步路线地图 (转)值得学习百度开源70+项目

    ASP.NET MVC WebApi 返回数据类型序列化控制(json,xml)   我们都知道在使用WebApi的时候Controller会自动将Action的返回值自动进行各种序列化处理(序列化为 ...

随机推荐

  1. PowerDesigner的数据类型

    用PowerDesigner 15 设计个数据库,每个字段的数据类型设计真是头大,根据字段意思看用哪个类型最合适还得仔细研究呀.贴几个数据类型表格收藏一下^_^ Numeric data types ...

  2. IntentFilterDemo

    intent-filter示例: <activity android:name=".CustomActivity" android:label="@string/t ...

  3. 十一、Android学习笔记_AsyncQueryHandler的应用

    研究AsyncQueryHandler这个类的时候遇到了几个重要的不清楚的知识点 1. Handler与Thread,Looper的关系 2. HandlerThread是干什么用的 3. Threa ...

  4. GitHub之上传文件

    github是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要公开.对于一般人来说公共仓库就已经足够了,而且我们也没多少代码来管理,O(∩_∩)O ...

  5. JavaScript之延迟加载

    本文参阅http://www.appelsiini.net/projects/lazyload Javascript Lazyload延迟加载特效,有效降低HTPP连接次数,提高首屏加载时间 1.增加 ...

  6. Android之adb命令

    1.安装APK(如果加 -r 参数,保留已设定数据,重新安装filename.apk) adb install xxx.apk adb install -r xxx.apk 2.卸载APK(如果加 - ...

  7. tcpServer 浅显的发一代码

    接下来发出来的一段代码也是我从网上找的一个例子,具体的来源已经找不到了,跟作者说声抱歉 ,现在公司做机票,出于性能的原因,就重写一个底层的tcp请求(不是我写的) 下面测试的是个控制台应用程序 Htt ...

  8. PHP的final、抽象类和方法

    final关键字的用法 final class Computer{ //无法继承的类 final public function run(){ //无法继承的方法 } } class NoteBook ...

  9. hdu 2602 Bone Collector 背包入门题

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602 题目分析:0-1背包  注意dp数组的清空, 二维转化为一维后的公式变化 /*Bone Coll ...

  10. OpenGL 回顾——简化版的窗体(包含鼠标控制,普通键位控制,以及镜面反射)

    // OpenGLBook.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" //变量声明 static GLfloat spin =0.0; ...