欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

TextView中URL等指定特殊字符串与点击事件解析

程序员文章站 2022-06-04 10:45:51
使用textview时,有时可能需要给予textview里的特定字符串,比如url,数字特别的样式,必希望能够添加点击事件。比如发短信时,文字里的url就可以点击直接打开浏...

使用textview时,有时可能需要给予textview里的特定字符串,比如url,数字特别的样式,必希望能够添加点击事件。比如发短信时,文字里的url就可以点击直接打开浏览器,数字可以点击拨打电话。

android提供了spannablestring类来对textview的内容进行处理,具体步骤: 

1.new一个spannablestring对象,传入需要显示在textview上的内容; 

2.对内容进行处理(比如用正则表达式解析出url或数字等等,并指定样式),这部分的核心就是调用spannablestring对象的setspan()方法;

public void setspan(object what, int start, int end, int flags);

可以看到有四个参数,start 和 end 是意味着你要改变的是该字符串下标start到end的部分,what可以传入对start到end的文本的处理方式或者样式,也可以传入你指定的东西来取代文本,比如图片。flags总共有四种,他意味着是否影响指定处前一个或后一个字符串 

3.textview.settext(spannablestring),由于spannablestring实现了charsequence,所以textview可以直接set。

注意:到这里textview的指定内容就已经实现指定样式了。,但是如果想要添加点击事件,还需要让textview调用setmovementmethod(movementmethod movement)来实现点击事件。 

下面贴出我的demo,实现将textview里的数字标注出来,点击数字将弹出toast将数字显示出来。

 private void init() {
  tvmain.setmovementmethod(linkmovementmethod.getinstance());
  spannablestring s = new spannablestring(content);
  filternumber(s);
  tvmain.settext(s);
 }

 private static final string reg = "\\d+";

 public class textclickablespan extends clickablespan {
  private string text;

  public textclickablespan(string text) {
   this.text = text;
  }

  @override
  public void onclick(view view) {
   toast.maketext(myactivity.this,text,toast.length_short).show();
  }
 }
private void filternumber(spannable s) {
  matcher m = pattern.compile(reg).matcher(s.tostring());
  while (m.find()) {
   string text = m.group();
   textclickablespan span = new textclickablespan(text);
   s.setspan(span,m.start(),m.end(), spanned.span_exclusive_exclusive);
  }
 }

代码很简单,首先要说的是clickablespan,因为当你点击该特定字符串时,linkmovementmethod的ontouchevent()方法,将会根据你点击的位置获得clickablespan对象,并执行该对象的onclick方法。而这个clickablespan需要在setspan时传入(这个地方不仅可以传入clickablespan还有诸如imagespan等等,不过如果要可以点击的话,要传入clickablespan。其他的这里不一一赘述)。

然后我的filternumber方法,就是利用正则表达式来过滤数字,并调用setspan一一传入相应start和end。

最后,要说下setspan的最后一个参数flags:

spanned.span_inclusive_exclusive 是当前这个设置包括前面,不包括后面

spanned.span_exclusive_exclusive 当前设置前后不包括

spanned.span_inclusive _inclusive 当前设置包括前面,包括后面

spanned.span_exclusive_inclusive 当前设置不包括前面,包括后面

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。