使用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 当前设置不包括前面,包括后面
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持小牛知识库。
我想检查一个字符串是否包含特殊字符,比如!@#$%^&*.,<>/\'“;:?如果字符串至少包含其中一个字符,则返回true。 我尝试使用以下regex脚本:
我有一个从xml文档中读取数据的程序。在这个xml文档中,一些属性包含特殊字符,如“\n”、“t”等。 有没有一种简单的方法可以将所有这些字符串替换为实际的字符,或者我必须像下面的例子一样为每个字符手动替换? 手动示例: 编辑: 我正在寻找某种方法来处理字符串,就像这样的转义字符串(尽管我知道这是行不通的)
问题内容: 在Java中,我需要使用HTTP Post将请求发送到服务器,但是如果URL的参数中包含一些特殊字符,它将在Exception下面抛出 java.lang.IllegalArgumentException:URLDecoder:转义(%)模式中的非法十六进制字符-对于输入字符串:“&’” 发送数据的代码 在服务器端,我使用以下代码读取信息 代码可以正常工作,但是如果我输入一些特殊字符,
我正在制作一个程序,从传奇联盟api获取数据,它分析你当前的游戏,并向你显示你的对手的名字,等级和东西。但我有一个问题,因为要获得某人的排名,我需要访问一个特定的url,其中包含他的尼克。问题是,一些玩家在他们的刻痕中放置了å、á、è、ö之类的角色,当这种情况发生时,我的程序就会停止工作。我将向您展示我用来实现这一点的部分代码: 这就是它抛出的错误:java。io。IOException:服务器返
我有一个HashMap,里面有键和值。我想用字符串中映射的值替换键。 在字符串中,键被写成@keyname或@“keyname”,这些应替换为map.get(“keyname”) 假设我们的地图是这个 所以如果我们处理字符串“Hello world,Iam@key1 years old.”,它将变成“Hello world,Iam 2 years old.”。 我们可以用@“key1”代替@key
问题内容: 我在删除特殊字符时遇到问题。我想删除除“()/。%-&”以外的所有特殊字符,因为我将该字符串设置为标题。 我编辑了原始代码(如下所示): 但这无法删除特殊字符,例如:“,”,“”。 原始代码:(此方法有效,但会删除以下字符:“()/。%-&”) 问题答案: 您的句点匹配所有字符。转义它(和其他特殊字符),如下所示: