Android开发之TextView高级应用

我们平时使用TextView往往让它作为一个显示文字的容器,但TextView的功能并不局限于此。以下就和大家分享一下TextView的一些使用技巧。

Android中设置文本样式的几种方法:

1.将android:autoLink属性值设为true。

系统会自己主动识别E-mail、电话、网址等特殊文本。

2.使用Html标签,比如。<font>、<img>等。

不要设置 android:autoLink 属性。

3.在Java代码中直接使用Span对象来设置文本样式。

这样的方法须要将文本转换成一个SpannableString或SpannableStringBuilder对象,然后在SpannableString或SpannableStringBuilder对象中使用setSpan方法将要设置样式的文本转换成对应的Span对象。

4.在字符串资源中使用<a>标签(仅仅支持<a>标签)设置可单击的链接。不要设置android:audoLink属性。

上面4种方法仅仅要涉及单击动作,就必须使用TextView.setMovementMethod方法设置对应的MovementMethod对象。

1.在TextView中显示图像


我们浏览网的时候,上面的有非常多图文并茂的文章,这些文章大部分都是从server的数据库中取出并显示在网页上的。

那么怎样在网页上显示图文并茂的文章呢?有过Java Web或.NET开发经验的人,会说用s:textfield或asp:label绑定。用它们是由于它们能够将<img>标签的src相应的图像地址(也是图像资源的唯一标识)直接交给浏览器出处理。

这样就能够将<img/>的src相应的图片显示出来。

那么,在Android中怎样用TextView显示图片呢?

在解析Html标签来方面Android系统没有浏览器那么强大,Android系统不会直接依据src属性说指向的的值自己主动获取并显示图片。这一切都须要我们来帮它来完毕。

说白了。src属性指的是什么仅仅有开发人员自己知道。开发人员须要告诉系统src属性究竟指的是什么,然后系统才会知道怎么做。

解析src属性值须要ImageGetter对象的getDrawable方法来完毕。ImageGetter是一个接口。

使用Html.fromHtml会使这一过程变得简单。(关于Html.fromHtml的介绍)

txtShow=(TextView)findViewById(R.id.txtShow);

String htmlText="小黄人1号:<img src='xiaohuangren1'/>" +"小黄人2号:<img src='xiaohuangren2'/>"+"小黄人3号:<img src='xiaohuangren3'/>";

txtShow.setText(getSpanned(htmlText));

/**

*将Html解析成样式文本

*@return spanned Spanned

* */

private Spanned getSpanned(String htmlText) {

//TODO Auto-generated method stub

Spanned spanned=Html.fromHtml(htmlText,new ImageGetter() {   @Override

public Drawable getDrawable(String source) {

//TODO Auto-generated method stub

//装在图像资源

Drawable drawable=getResources().getDrawable(getResourceId(source));

if (source.equals("xiaohuangren1")) {

//设置图像的缩放

drawable.setBounds(0, 0, 56, 56);

}elseif (source.equals("xiaohuangren2")) {

//设置图像的缩放

drawable.setBounds(0, 0, 36, 36);

}elseif (source.equals("xiaohuangren3")) {

//设置图像缩放到原来的75%

drawable.setBounds(0, 0,(int) (drawable.getIntrinsicWidth()*0.75),

(int) (drawable.getIntrinsicHeight()*0.75));

}

return drawable;

}

},null);

return spanned;

}

/**

*利用反射技术从R.drawable类中通过图像资源文件名称获得对应图像资源的ID

*@param name String图像资源名

*@return图像资源ID int

* */

protectedint getResourceId(String name) {

//TODO Auto-generated method stub

try {

//依据资源ID的变量名(也就是图像资源的文件名称)获取Field对象

Field field=R.drawable.class.getField(name);

//取得并返回资源ID的值

return Integer.parseInt(field.get(null).toString());

}catch (Exception e) {

//TODO: handle exception

}

return 0;

}

2.单击TextView中的内容打开指定Activity


尽管TextView能够自己主动识别特殊文本(网址、电话号、E-mail等),并能够通过单击触发不同的动作。可是假设开发人员想通过单击链接来显示指定的组件(如Activity、Service等)那么怎么来实现呢?

TextView自己主动识别的网址、电话号、E-mail等。都是在ClickableSpan类的onClick方法中通过Action调用对应的组件来实现的。如今我们就採用类似的方法,通过自己实现onClick方法来达到自己定义自己定义单击动作的目的。

/**

*单击TextView中的内容启动指定组件

* */

privatevoid launchComponentByTextView() {

//TODO Auto-generated method stub

txtLink=(TextView)findViewById(R.id.txtLink);

String str="单击我启动一个Activity";

//将文本转换成SpannableString对象

SpannableString spannableString=new SpannableString(str);

//将spannableString全部文本设置成ClickableSpan对象。并实现onClick方法

spannableString.setSpan(new ClickableSpan() {

@Override

publicvoid onClick(View widget) {

//TODO Auto-generated method stub

//启动指定Activity

Intent intent=new Intent(MainActivity.this, SecondActivity.class);

startActivity(intent);

}

}, 0, str.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

txtLink.setText(spannableString);

//在单击链接时凡是要运行的动作。都必须设置MovementMethod对象

txtLink.setMovementMethod(LinkMovementMethod.getInstance());

}

实例分析:

在本例中setSpan方法的第四个參数设置成了Spanned.SPAN_EXCLUSIVE_EXCLUSIVE,该标志在 TextView 控件中意义不大,但在 EditText控件中表示在当前Span效果的前后输入字符时并不应用Span的效果。关于SpannableString的具体介绍大家能够參照:Android开发之SpannableString具体解释。

  

3.为指定文本加入颜色和背景色


从前面几个实例的内容能够得知设置字符中某个子字符串的样式(变成可单击的链接、设置字体等)须要例如以下几步。

(1)   将字符串转换成SpannableString或SpannableStringBuilder对象。

(2)   获得要设置样式的子字符串在原字符串中的開始位置和子字符串后面的字符的位置,也就是 start和end。

(3)   创建一个Span对象(全部android.text.style包中的XxxSpan类创建的对象的统称,Xxx表示URL、BackgroundColor等类的前缀)。

(4)   使用setSpan方法设置个Span对象,也就足说•将要设置样式的子字符串转换成坤拙对象。

(5)   用处理完的SpannableString或SpannableStringBuilder对象设置对应的控件(如TextView、EditText、Button等)。

在Android SDK的andrmd.text.styte包中提供非常多现成的Span对象,比如’ BackgroundColorSpan类就是一个非经常常使用的Span类。该类的功能是设置指定字符串的背景色,用法例如以下:

txtSetBackgroundColor=(TextView)findViewById(R.id.txtSetBackgroundColor);

String str="没有背景|黄色背景";

//第一步将字符串转换成SpannableString对象

SpannableString spannableString=new SpannableString(str);

//第二步确定设置要设置的子字符串在原字符串的開始位置和接收位置即start和end

String subStr="黄色背景";

int start=str.indexOf(subStr);

int end=start+subStr.length();

//第三步创建一个BackgroundColorSpan对象

BackgroundColorSpan backgroundColorSpan=new BackgroundColorSpan(Color.YELLOW);

//第四步使用setSpan方法将指定子字符串转换成BackgroundColorSpan对象对象

spannableString.setSpan(backgroundColorSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

//第五步用SpannableString对象设置TextView控件

txtSetBackgroundColor.setText(spannableString);

BackgroundColorSpan仅仅能设置文字的背景色。为了更加通用。我们来自己编写一个ColorSpan类。使其同一时候能够设置文字颜色和背景色(android.text.style.ForegroundColorSpan类能够设置文字颜色,但并没有可同一时候设置背景和文字颜色的Span类)。在实例2给出了一个通过继承ClickableSpan类来编写自己定义Span类的样例。只是这个样例须要处理链接动作,所以必须要继承ClickableSpan类。而本例仅仅要设置文字和背景颜色就可以,并不须要处理不论什么动作,因此,仅仅须要从CharacterStyle类继承就可以。实际上,ClickableSpan也是CharacterStyle的子类。能够设置文字和背景颜色的ColorSpan类的代码例如以下:

/**

* Describe:</br>

*</br>自己定义一个CharacterStyle的子类

*</br>用于改动文字的颜色和背景色

*</br>@author jph

*</br>Date:2014.08.10

* */

publicclass ColorSpanextends CharacterStyle {

//声明文字的颜色和背景色

privateinttextColor,backgroundColor;

/**

*初始化ColorSpan类

*@param textColor 文字颜色

*@param backgroundColor文字背景色

* */

public ColorSpan(int textColor,int backgroundColor) {

//TODO Auto-generated constructor stub

this.textColor=textColor;

this.backgroundColor=backgroundColor;

}

//覆盖CharacterStyle类中的updateDrawState方法。并在该方法中设置字体颜色和背景色

@Override

publicvoid updateDrawState(TextPaint tp) {

//TODO Auto-generated method stub

tp.bgColor=backgroundColor;

tp.setColor(textColor);

}

}

在ColorSpan类中实现了CharacterStyle类的updateDrawState方法。该方法在系统開始绘制要设置样式的字符串之前调用,以便改动绘制文字的属性,比如。文字颜色、背景颜色等。当中TextPaint是Paint的子类。Paint类用于描写叙述绘制的属性,如画笔的颜色、画笔的粗细等。如今我们来同一时候使用BackgroundColorSpan和ColorSpan类设置文字和背景颜色。代码例如以下:

txtMyColor=(TextView)findViewById(R.id.txtMyColor);

ColorSpan colorSpan=new ColorSpan(Color.RED, Color.WHITE);

String str="红色字体|灰色背景";

String subStr="灰色背景";

int start=str.indexOf(subStr);

int end=start+subStr.length();

SpannableString spannableString=new SpannableString(str);

spannableString.setSpan(colorSpan, 0, start, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

colorSpan=new ColorSpan(Color.WHITE, Color.GRAY);

spannableString.setSpan(colorSpan, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

txtMyColor.setText(spannableString);

Android开发之TextView高级应用相关推荐

  1. android studio输入框下划线,Android开发之TextView的下划线添加

    Android开发之TextView高级应用 Android开发之TextView高级应用 我们平时使用TextView往往让它作为一个显示文字的容器,但TextView的功能并不局限于此.以下就和大 ...

  2. Android开发之TextView的滚动显示

    在使用TextView的时候,我们经常会遇到TextView里面的文本内容过多,导致不能看到TextView里面的全部内容,下面实现TextView的滚动: <!-- 垂直滚动 --> a ...

  3. Android开发之TextView排版问题

    下面直接是关于解决该问题的代码(根据别人的代码进行了修正以及测试,保证可以修改字体尺寸.颜色.根据padding调整,如果需要支持其他的格式可以将对应的属性添加至Paint类型的对象中): 1 pub ...

  4. android之json解析优化,Android开发之json解析

    目前正在尝试着写app,发现看懂代码和能写出来差距很大,最关键的是java基础比较的差,因为只会python,java基础只学习了一个礼拜就过了.感觉java写出来的代码不如python简单明了. 上 ...

  5. Android开发之SpannableString具体解释

    在实际的应用开发过程中常常会遇到.在文本的不同部分显示一些不同的字体风格的信息如:文本的字体.大小.颜色.样式.以及超级链接等. 普通情况下,TextView中的文本都是一个样式.对于类似的情况.能够 ...

  6. Android软件开发之TextView详解(六)

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

  7. Android开发之2048安卓版

    之前是在eclipse上写的,后面换成了android sudio. 2048游戏的UI整体可以采用线性布局,即LinearLayout,其中嵌套一个线性布局和一个GridLayout,内嵌的线性布局 ...

  8. Android开发之JNI(一)--HelloWorld及遇到的错误解析

    Android开发之JNI(一)--HelloWorld及遇到的错误解析 1.NDK环境搭建 參考http://blog.csdn.net/xiaoliouc/article/details/8705 ...

  9. Android开发之旅:HelloWorld项目的目录结构

    引言 前面Android开发之旅:环境搭建及HelloWorld,我们介绍了如何搭建Android开发环境及简单地建立一个HelloWorld项目,本篇将通过HelloWorld项目来介绍Androi ...

最新文章

  1. python路1---variable
  2. SVM学习(一):SVM概念
  3. Linux 下hosts文件详解
  4. 淘宝JavaScript 编码风格规范
  5. 幅度调制(AM调制、DSB(双边带)调制、SSB、VSB)
  6. t3系统建账请到服务器端修改,用友T3标准版常见问题及处理方法(一)
  7. 基于Android的家校联系平台开发(论文)
  8. 计算机使用交接记录表,交接文档_计算机软件及应用_IT计算机_专业资料
  9. Django项目部署以及nginx配置
  10. ARM嵌入式开发,高通MSM8937核心板h
  11. 中国移动G3随e行最详教程
  12. josn 格式 解析
  13. Daily errors about log encoding and web page garbled characters
  14. 中国齿科粘接剂行业发展趋势及前景动态预测报告2022-2027年
  15. 数据结构与算法【Java】05---排序算法总结
  16. 主动积极:卓尔不群的个人管理策略
  17. 带登录页面的猜数字小游戏
  18. unity官方教程 太空射击---问题填坑 之 计分以及游戏胜利
  19. 车辆重识别综述(2021年非专业总结)
  20. springboot毕设项目软件外包服务39e05(java+VUE+Mybatis+Maven+Mysql)

热门文章

  1. ajax从页面向action传递json 公司--》
  2. 233网校java_java辅导:使用java模拟登陆考试大
  3. 项目服务器有15个能说明什么,15.1 我的面试经历 by smyhvae - 前端入门进阶
  4. html 元素允许右键,JavaScript 自定义html元素鼠标右键菜单功能
  5. 请简述什么是spring的ioc和di_绿茶用什么茶叶罐储存?有6种茶叶罐适合
  6. 一个“人工智能Python机器学习与深度学习”课程表
  7. 骑摩托的蒙娜丽莎 - 曼妙风骚的花式慢跑算法
  8. 基于ESP32的竞赛裁判系统功能调试-与微机通讯
  9. 利用Arduino IDE对ATMEGA8等单片机编程
  10. 2021年春季学期-信号与系统-第十三次作业参考答案-第十小题