`
在下个路口
  • 浏览: 111155 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Android之TextView的局部事件

 
阅读更多
  我们都知道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
分享到:
评论

相关推荐

    Android中TextView局部变色功能实现

    Android 中 TextView 局部变色功能实现 Android 中 TextView 局部变色功能实现是指在 Android 应用程序中,实现 TextView 中部分文字不同颜色的功能。这个功能非常重要,特别是在开发一些需要文字颜色变化的应用...

    Android长按TextView复制文本内容,可以直接使用

    `TextView`是Android UI框架中的基础组件之一,常用于显示单行或多行文本。在许多应用中,用户可能需要复制`TextView`中的文本以便稍后使用。Android系统提供了一个方便的功能,允许用户通过长按`TextView`来实现...

    Android Textview 支持ClickableSpan(富文本)

    *设置Textview 中部分字设置可以点击、变色,设置setMovementMethod(LinkMovementMethod.getInstance())后滑动与Textview局部点击冲突...都已经解决. *解决点击空白区域依然有点击事件 *已经封装成工具类,可以支持...

    android textview 指定片段添加点击事件

    在Android开发中,TextView是用于显示文本的基本组件。在许多情况下,我们可能希望对TextView中的特定文本片段设置点击事件,以便用户点击时触发相应的功能。本篇将详细讲解如何在Android中实现TextView指定片段的...

    TextView中,设置指定部分文字改变颜色,和指定部分文字点击事件

    在Android开发中,`TextView`是用于展示文本的常用组件,它可以进行丰富的文本格式化和交互操作。在一些场景下,我们可能需要对`TextView`中的特定部分文字进行颜色变化,甚至为这部分文字添加点击事件,以实现更...

    SpannableString 一个TextView不同的效果实现

    这个技术专题主要探讨如何利用SpannableString来创建一个TextView,实现点击事件、下划线、局部字体放大、局部颜色变化以及删除线等多种功能。 首先,SpannableString是CharSequence的一个子类,它允许我们对字符串...

    Android-FlexibleRichTextView可以显示LaTeX图片代码的TextView

    `Android-FlexibleRichTextView`是一个专门为此目的设计的库,它使得在Android的TextView中嵌入LaTeX图像、图片以及代码变得更加灵活和便捷。 `FlexibleRichTextView`的核心特性在于其支持自定义标签,这意味着...

    Android实现局部模糊效果

    Android 实现局部模糊效果 Android 实现局部模糊效果是指在 Android 应用程序中实现局部模糊或者毛玻璃效果的技术。这种效果可以用来创造出非常酷炫的视觉效果,例如模糊背景、毛玻璃效果等。 在 Android 中实现...

    android编程实现局部界面动态切换的方法

    import android.widget.TextView; public class MainActivity extends AppCompatActivity { private Button btnSwitch, btnScreen; private LinearLayout frameSwitch; @Override protected void onCreate...

    android中的全局悬浮框不影响底层操作

    1. 创建一个自定义布局XML文件,如`float_view.xml`,定义你想要在悬浮框中展示的元素,例如一个ImageView和一个TextView。 2. 在你的Activity或Service中,实例化`WindowManager`和`LayoutParams`: ```java ...

    Android中使用LinearLayout完成的四书五经首界面的代码清单 .pdf

    在Android应用开发中,LinearLayout是一种基础且常用的布局管理器,用于组织和排列子视图(Views)在垂直或水平方向上。本文将详细解析如何使用LinearLayout来构建一个四书五经首界面的代码清单,以此帮助开发者理解...

    android 改变字体样式

    在Android开发中,改变字体样式是一项重要的任务,它能让应用程序具有更高的可定制性和用户体验。...无论是局部还是全局的应用,都需要充分考虑到用户体验、性能和兼容性,以打造一个既美观又高效的Android应用。

    Android应用源码之style.zip

    "Android应用源码之style.zip"提供的源码资源显然与Android应用中的自定义风格设置有关。下面我们将深入探讨Android应用中风格的使用及其重要性。 1. **什么是Android风格(Style)**: - 风格是XML文件中定义的一...

    android界面开发笔记相关代码

    最后,Android的触摸事件处理机制是基于事件分发链的。触摸事件会从顶级ViewGroup开始,逐级向下传递,直到被某个视图消耗。开发者可以通过覆写onTouchEvent()方法来处理这些事件。 总结来说,Android界面开发涵盖...

    android-UI.rar_android_android ui_ui

    3. **控件(Widgets)**:Android提供了丰富的UI控件,如TextView、EditText、Button、ImageView等,用于构建交互式的用户界面。开发者可以自定义控件样式,调整其外观和行为。 4. **主题和样式(Themes & Styles)...

    两个小时精通Android开发之界面篇

    此外,Android提供了丰富的UI组件,如TextView、EditText、Button、ImageView等,它们都有各自的属性和事件监听机制。比如,TextView用于显示文本,可以通过设置textSize、textColor等属性调整文本样式;ImageView则...

    Android UI 基础教程

    3. **控件(Widgets)**:Android提供了一系列预定义的UI控件,如按钮(Button)、文本视图(TextView)、输入框(EditText)等。学会如何创建、定制和组合这些控件,是构建用户界面的关键步骤。 4. **事件处理**:...

Global site tag (gtag.js) - Google Analytics