文档章节

【转】edittext设置点击链接

zaaack
 zaaack
发布于 2014/10/14 23:37
字数 275
阅读 15
收藏 0

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

 

本文转载自:

共有 人打赏支持
zaaack

zaaack

粉丝 34
博文 92
码字总数 43513
作品 8
长沙
程序员
私信 提问
Android软件开发之TextView详解(六)

Android软件开发之TextView详解 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/details/6625662 TextView的API 中文文档中 说明...

彭博
2012/03/09
114
0
Android软件开发之TextView详解(六)

Android软件开发之TextView详解 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/details/6625662 TextView的API 中文文档中 说明...

晨曦之光
2012/03/07
729
0
Android软键盘的一些控制

"EditText + Button" 形成一个 "输入+按键响应" 的案例在android编程中是最常见不过的了。 但还有一些细节需要注意: 在EditText输入后,点击Button进行请求,软键盘应该自行消失 在EditTex...

晨曦之光
2012/03/05
758
0
Android软件开发之EditText 详解(八)

Android软件开发之EditText 详解 雨松MOMO原创文章如转载,请注明:转载自雨松MOMO的博客原文地址:http://blog.csdn.net/xys289187120/article/details/6629450 EditText在API中的结构 java...

彭博
2012/03/09
165
0
Android开发:跳转界面时出现错误

你好,我是刚学Android开发的,做程序多数是参考书本,所以可能有些隐藏的内容没留意,或者说是不懂,我昨天搞了个Android跳转窗体的程序,但是老是那个错误:The application 填写用户信息(...

黄涛11
2012/04/07
2.2K
1

没有更多内容

加载失败,请刷新页面

加载更多

RestClientUtil和ConfigRestClientUtil区别说明

RestClientUtil directly executes the DSL defined in the code. ConfigRestClientUtil gets the DSL defined in the configuration file by the DSL name and executes it. RestClientUtil......

bboss
今天
11
0

中国龙-扬科
昨天
2
0
Linux系统设置全局的默认网络代理

更改全局配置文件/etc/profile all_proxy="all_proxy=socks://rahowviahva.ml:80/"ftp_proxy="ftp_proxy=http://rahowviahva.ml:80/"http_proxy="http_proxy=http://rahowviahva.ml:80/"......

临江仙卜算子
昨天
9
0
java框架学习日志-6(bean作用域和自动装配)

本章补充bean的作用域和自动装配 bean作用域 之前提到可以用scope来设置单例模式 <bean id="type" class="cn.dota2.tpye.Type" scope="singleton"></bean> 除此之外还有几种用法 singleton:......

白话
昨天
8
0
在PC上测试移动端网站和模拟手机浏览器的5大方法

总结很全面,保存下来以备不时之需。原文地址:https://www.cnblogs.com/coolfeng/p/4708942.html

kitty1116
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部