我们都知道Android控件的事件监听,整个控件的监听很简单,但是如果我们要获取TextView中部分文字的焦点,响应点击事件,那又该怎么实现呢?
在java中,SpannableString这个类就可以很好的帮我们实现这个功能,它是通过设置超链接的方式完成的。本文要实现的功能就是从显示在TextView上的字符串中解析出英文单词,然后给这些英文单词设置局部监听事件,这个功能适用于视频播放器的字幕显示效果中。
声明全局变量:
private SpannableString msp=null;
private String txtStr="文本Get焦点,响应Click事件!";
主要代码:
public void handlerStr(String str){
msp=new SpannableString(str);
List<Integer> enStrList=TextUtils.getENPositionList(str);
String tempStr=str.charAt(enStrList.get(0))+"";
for(int i=0;i<enStrList.size()-1;i++){
if(enStrList.get(i+1)-enStrList.get(i)==1){
tempStr=tempStr+str.charAt(enStrList.get(i+1));
}else{
setLink(enStrList.get(i)-tempStr.length()+1, enStrList.get(i)+1,tempStr);//因为此时i在循环中已经自加了
tempStr=str.charAt(enStrList.get(i+1))+"";
}
}
setLink(enStrList.get(enStrList.size()-1)-tempStr.length()+1, enStrList.get(enStrList.size()-1)+1,tempStr);
}
将原始的字符串传进该方法,实例化SpannableString对象msp,getENPositionList该方法是自己定义的用来获取英文字母在字符串中所在位置的,并且将每个英文字母的所在位置存放在一个List中,该方法代码:
/**
* 从str中得到英文字符
* @param str
* @return 存放英文字符在str中位置的List
*/
public static List<Integer> getENPositionList(String str){
List<Integer> list=new ArrayList<Integer>();
for(int i=0;i<str.length();i++){
char mchar=str.charAt(i);
//('a' <= mchar && mchar <= 'z')||('A' <= mchar && mchar <='Z')
if(Pattern.matches("[A-Za-z]", mchar+"")){
list.add(i);
// System.out.println(i+"位置为英文字符:"+mchar);
}
}
return list;
}
其中用到正则表达式匹配英文字母,当然也可以用('a' <= mchar && mchar <= 'z')||('A' <= mchar && mchar <='Z')
这个判断条件,不过在很多时候正则表达式确实会为你省去很多的代码量。
得到存放英文字母位置的List后,那么接下来的就是解析出每个单词了,在这里我是利用判断list中两个相邻元素的值的差为1,之后字符拼加,直到下一个元素的值减去上一个元素的值不为1时,此时判断该单词结束。例如,得到存放英文字母的List={2,3,4,10,11,12,13,14} enStrList.get(2)-enStrList.get(1)==1并且enStrList.get(3)-enStrList.get(2)!=1我就判断字符串中2,3,4为一个单词,也就是说enStrList中下一元素与上一元素的差值为1,就代表着在字符串中它们两个字母是相邻的,因此它们构成了一个单词,直到两元素的差值不为1,判断该单词结束。在将字母拼接成单词后,要做的就是给单词设置超链接了,设置超链接的方法为:
/**
* 给指定的[start,end)字符串设置链接
* @param start 设置链接的开始位置
* @param end 设置链接的结束位置
* @param clickStr 点击的字符串
*/
public void setLink(int start,int end,String clickStr){
// msp.setSpan(new URLSpan("http://www.baidu.com"), start, end, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
msp.setSpan(new MyURLSpan(ctx,clickStr), start, end, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
captionShow.setText(msp);
captionShow.setMovementMethod(LinkMovementMethod.getInstance());
}
这个方法不难,但却是本文的重点,注意msp不能在该方法里实例化,否则重复设置超链接用的是不同的对象,那么只会保留最后一次设置的超链接了;captionShow为显示的TextView。设置超链接主要代码4句:
msp=new SpannableString(str);
msp.setSpan(new URLSpan("http://www.baidu.com"), start, end, SpannableString.SPAN_EXCLUSIVE_EXCLUSIVE);
captionShow.setText(msp);
captionShow.setMovementMethod(LinkMovementMethod.getInstance());
一定要记得写captionShow.setMovementMethod(LinkMovementMethod.getInstance())这一句,不然设置是不会成功的。其中new URLSpan("http://www.baidu.com")这个可以是很多种类,比如邮件,网址,电话等,注意每种写的格式不一样就行。当然也可以是自定义的,我这是自定义的URLSpan()类,只需要继承ClickableSpan即可。
public class MyURLSpan extends ClickableSpan{
private Context ctx;
private String clickStr;
public MyURLSpan(Context ctx,String clickStr){
this.ctx=ctx;
this.clickStr=clickStr;
}
@SuppressWarnings("deprecation")
@Override
public void onClick(View widget) {
AlertDialog dialog=new AlertDialog.Builder(ctx).create();
dialog.setTitle("响应局部事件");
dialog.setMessage("您点击了局部事件:"+clickStr);
dialog.setButton("ok", (OnClickListener)null);
dialog.show();
}
}
继承ClickableSpan类,实现onClick方法,当我们点击那些设置了超链接的文字时,这个方法就会被触发,因此我们就可以在该方法中实现任何我们想要的效果了。
其实这个功能的最大难点是在单词切割,最后来重新整理一下思路:
一 从原始字符串中得到存放英文字母在字符串中所在位置的List;
二 根据list切割出单词,这是难点,主要是判断的逻辑理解起来有点难度;
三 给单词设置超链接。
以下是实现的效果图:
单词高亮显示
响应局部事件。
- 大小: 25.9 KB
- 大小: 17.3 KB
- 大小: 17.9 KB
分享到:
相关推荐
在TextView中长按可以复制textview的文本内容,经过验证,可以直接导入项目
给大家详细讲解了一下Android中TextView实现部分文字不同颜色的功能实现过程,有这方面需要的朋友们一起学习下吧。
*设置Textview 中部分字设置可以点击、变色,设置setMovementMethod(LinkMovementMethod.getInstance())后滑动与Textview局部点击冲突...都已经解决. *解决点击空白区域依然有点击事件 *已经封装成工具类,可以支持...
android textview 指定片段添加点击事件 关注博客 http://himici.com
关于TextView指定部分文字改变颜色,和指定部分文字点击事件的实现。
SpannableString 一个TextView不同的效果实现,实现了点击事件,下划线,局部字体变大,局部字体颜色变化,删除线等等,
主要为大家详细介绍了Android实现局部模糊效果,帮助大家实现模糊或者毛玻璃效果,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文带您全面了解Android开发规范,其中包括Android编码规范,Android性能优化和Android UI优化,读完绝对不会后悔的好文章。 一、Android编码规范 1.java代码中不出现中文,最多注释中可以出现中文 2.局部变量...
实现原理是使用android-support-v4.jar包中ViewPager控件,在ViewPager控件中设置流布局,再在流布局中设置几项TextView,给每一个TextView设置相关参数,事件等。关于ViewPager控件可以设置全屏幕滑动效果,当然也...
作者angcyo,源码HighlightTextView,HighlightTextView局部高亮的TextView,可以设置高亮字符开始的位置,高亮字符的个数,高亮字符的颜色。
一、Android开发编码规范 1、java代码中不出现中文,最多注释中可以出现中文 2、局部变量命名、静态成员变量命名 只能包含字母,单词首字母出第一个外,都为大写,其他字母都为小写 3、常量命名 只能包含字母和...
1.创建一个包含ScrollView的布局文件: ... import android.app.Activity;import android.os.Bundle;import android.view.View;...import android.widget.TextView; public class MainActivity extends Activity implem
实现原理是使用android-support-v4.jar包中ViewPager控件,在ViewPager控件中设置流布局,再在流布局中设置几项TextView,给每一个TextView设置相关参数,事件等。关于ViewPager控件可以设置全屏幕滑动效果,当然也...
同时,为了适应个别界面的“特殊需求”,LoadingLayout也支持局部设置各种属性,仅对当前对象生效,不影响全局。如下: LoadingLayout loading = (LoadingLayout) findViewById(R.id.loading_layout); ...