前言

  开门见山,这一篇博客主要讲一下在Android开发中,UI控件TextView的一些使用方式,并且通过四个例子实现一般项目中需要的效果来讲解TextView的使用。并且在之后的一段时间之内,都会讲解关于AndroidUI控件的开发。

TextView

  之前讲解Android布局的时候,就已经说明,所有Layout都是View的子类或者间接子类。而TextView也一样,是View的直接子类。它是一个文本显示控件,提供了基本的显示文本的功能,并且是大部分UI控件的父类,因为大部分UI控件都需要展示信息。

  如果仅仅是展示文本,那么TextView的作用就太小了,所以它还预定义了一些类似于HTML的标签,通过这些标签可以使TextView控件显示不同的颜色、大小、字体、图片、链接。这些HTML标签都需要android.text.Html类的支持,但是并不包括所有的HTML标签。

  常用的可以再TextView中设定的标签有:

  • <font>:设置颜色和字体。
  • <big>:设置字体大号
  • <small>:设置字体小号
  • <i>\<b>:斜体\粗体
  • <a>:连接网址
  • <img>:图片

  使用这些标签可以用Html.fromHtml方法将这些标签的字符串转换成CharSequence接口,然后在TextView.setText()中进行设置。如果需要响应设置的HTML标签进行响应,需要设置TextView.setMovementMethod(LinkMovementMethod.getInstance())。

  CharSequence为接口类型,大家可能对其有点陌生,但是它的子类肯定会让大家有熟悉的感觉,String、StringBuffer、StringBuilder、SpannableString、SpannableStringBuilder都是其子类,它包括了字符串的所有类,因为面向对象的多态性,在这里把他理解成字符串类的抽象即可。

  除了使用HTML标签的方式设定显示文本中的URL地址、邮箱地址、电话等产生超链接出发相应的服务,可以使用android:autoLink属性来设置,以下是android:autoLink属性的介绍:

  • None:默认的,不匹配任何连接。
  • web:网址。
  • email:邮箱。
  • phone:电话号码。
  • map:匹配映射网址。
  • all:匹配所有连接。

显示富文本

  讲了这么多,通过第一个例子来讲解一下TextView使用HTML标签设定样式和通过autoLink属性来设置超链接效果,在XML布局文件中定义两个TextView,分别展示HTML标签和autoLink属性的使用。

  XML布局文件textviewdemo.xml代码:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="20sp"
/>
<TextView
android:id="@+id/textView2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:padding="20sp"
android:autoLink="all"
android:textSize="20sp"
/>
</LinearLayout>

  Activity文件textViewDemoActivity.java代码:

 package cn.bgxt.textviewdemo;

 import android.app.Activity;
import android.os.Bundle;
import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.widget.TextView; public class textViewDemoActivity extends Activity { private TextView textView1,textView2;
public textViewDemoActivity() {
// TODO Auto-generated constructor stub
}
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.textviewdemo);
//通过Id获得两个TextView控件
textView1=(TextView)findViewById(R.id.textView1);
textView2=(TextView)findViewById(R.id.textView2); //设置需要显示的字符串
String html="<font color ='red'>Hello android</font><br/>";
html+="<font color='#0000ff'><big><i>Hello android</i></big></font><p>";
html+="<big><a href='http://www.baidu.com'>百度</a></big>";
//使用Html.fromHtml,把含HTML标签的字符串转换成可显示的文本样式
CharSequence charSequence=Html.fromHtml(html);
//通过setText给TextView赋值
textView1.setText(charSequence);
//设定一个点击的响应
textView1.setMovementMethod(LinkMovementMethod.getInstance()); String text="我的URL:http://www.cnblogs.com/plokmju/\n";
text+="我的email:plokmju@sina.com\n";
text+="我的电话:+86 010-12345678";
//因为textView2中有autoLink=”all“的属性设定,所以会自动识别对应的连接,点击出发对应的Android程序
textView2.setText(text);
} }

 显示效果:

TextView显示图片

  第二个例子讲解一下在TextView中显示图片的例子,依然是使用HTML标签的方式定义样式,但是使用的是Html.fromHtml()的另外一个重载的静态方法,可以设定<img>标签中的图像资源。

  static Spanned fromHtml(String source,Html.ImageGetter imageGetter,Html.TagHandler tagHandler)

  对于这个方法,在imageGetter参数中设定<img>标签中的图像资源文件,tagHandler主要是为了处理Html类无法识别的html标签的情况,一般不会用上,传值为null即可。

  布局XML文件textvideforimg.xml代码:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textImg"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_margin="10dp" />
</LinearLayout>

  Activity文件textviewForImgActivity.java代码:

 package cn.bgxt.textviewdemo;

 import java.lang.reflect.Field;

 import android.R.color;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.Html;
import android.text.Html.ImageGetter;
import android.text.method.LinkMovementMethod;
import android.widget.TextView; public class textviewForImgActivity extends Activity { private TextView textViewImg;
public textviewForImgActivity() {
// TODO Auto-generated constructor stub
} @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.textvideforimg); textViewImg=(TextView)findViewById(R.id.textImg);
textViewImg.setTextColor(color.white);
textViewImg.setBackgroundColor(color.black);
textViewImg.setTextSize(20);
//设定HTML标签样式,图片3为一个超链接标签a
String html="图像1<img src='image1'/>图像2<img src='image2'/>\n";
html+="图像3<a href='http://www,baidu.com'><img src='image3'/></a>";
//fromHtml中ImageGetter选择html中<img>的图片资源
CharSequence cs=Html.fromHtml(html, new ImageGetter() { public Drawable getDrawable(String source) {
//source为html字符串中定义的<img>中的src的内容
//返回值Drawable就是对应的<img>显示的图片资源
Drawable draw=null;
if(source.equals("image1"))
{
draw=getResources().getDrawable(R.drawable.image1);
draw.setBounds(0, 0, draw.getIntrinsicWidth(), draw.getIntrinsicHeight());
}
else if(source.equals("image2"))
{
//设定image2尺寸等比缩小
draw=getResources().getDrawable(R.drawable.image2);
draw.setBounds(0, 0, draw.getIntrinsicWidth()/2, draw.getIntrinsicHeight()/2);
}
else
{
//使用反射会更简便,无需知道src与资源Id的对应关系
draw=getResources().getDrawable(getResourceId(source));
draw.setBounds(0, 0, draw.getIntrinsicWidth(), draw.getIntrinsicHeight());
}
return draw;
}
}, null);
textViewImg.setText(cs);
textViewImg.setMovementMethod(LinkMovementMethod.getInstance());
} public int getResourceId(String source)
{
try {
//使用反射机制,通过属性名称,得到其内的值
Field field=R.drawable.class.getField(source);
return Integer.parseInt(field.get(null).toString());
} catch (Exception e) {
// TODO: handle exception
}
return 0;
} }

  效果截图,其中第三个图片点击会触发浏览器访问百度网址:

  

在TextView增加Click事件

  第三个例子在TextView添加点击事件,导航到其他的Activity中。使用SpannableString.setSpan()设定那一段文本需要相应点击事件。与之类似的还有SpannableBuilder对象,他们的关系和String与StringBuilder一样。

  void setSpan(Object what,int start,int end,int flags)

  在what参数中传递一个抽象类ClickableSpan,需要实现其onClick()方法,此为指定文本的点击相应时间。start和end分别指定需要响应onClick()方法的文本开始与结束。flags设定一个标识,确定使用什么方式选择文本块,一般使用Spanned接口下的SPAN_EXCLUSIVE_EXCLUSIVE对其进行赋值,表示遵循设定的开始于结束位置的文本块。

  布局文件activityclick.xml的代码:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/clickTextView1"
android:textSize="30dp"
android:layout_marginTop="30dp"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<TextView
android:textSize="30dp"
android:layout_marginTop="30dp"
android:id="@+id/clickTextView2"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
</LinearLayout>

  Activity文件TextViewOnClickActivity.java的代码:

 package cn.bgxt.textviewdemo;

 import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.view.View;
import android.widget.TextView; public class TextViewOnClickActivity extends Activity { private TextView clickTextView1,clickTextView2; public TextViewOnClickActivity() {
} @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activityclick); clickTextView1=(TextView)this.findViewById(R.id.clickTextView1);
clickTextView2=(TextView)this.findViewById(R.id.clickTextView2);
String text1="显示Activity1";
String text2="显示Activity2";
//使用SpannableString存放字符串
SpannableString spannableString=new SpannableString(text1);
SpannableString spannableString2=new SpannableString(text2);
//通过setSpan设定文本块响应的点击事件
//此处只设定文本的索引为2开始的文本块:Activity1
spannableString.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
//导航到一个新的 Activity1中
Intent intent=new Intent(TextViewOnClickActivity.this,Activity1.class);
startActivity(intent);
}
}, 2, text1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); spannableString2.setSpan(new ClickableSpan() { @Override
public void onClick(View widget) {
// TODO Auto-generated method stub
Intent intent=new Intent(TextViewOnClickActivity.this,Activity2.class);
startActivity(intent);
}
}, 2, text1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //对TextView文本进行赋值
clickTextView1.setText(spannableString);
//设置点击响应
clickTextView1.setMovementMethod(LinkMovementMethod.getInstance());
clickTextView2.setText(spannableString2);
clickTextView2.setMovementMethod(LinkMovementMethod.getInstance()); }
}

  效果图,从图中可以看出只有点击setSpan中设定的代码块才可以触发点击事件:

跑马灯效果

  说到文本显示,最常见的效果就是跑马灯效果,这里以一个例子展示跑马灯的效果,基本无需使用Java代码,在布局文件中设定各项属性就已经可以实现这个效果了。

  在看代码前,先讲解一下等下会碰到的属性:

  • android:elipsize: 如果文本长度大于TextView的显示长度,则隐藏那一部分,可赋值为:none(不隐藏)、start(隐藏开始)、middle(隐藏中间)、end(隐藏结束)、marquee(滚动效果)。
  • android:marqueRepeatLimit:设定需要重复动画的次数,传递一个int值,-1为无限循环。
  • android:focusable:是否允许获得焦点,传递一个bool值。
  • android:focusableInTouchMode:是否在获得焦点时对控件有联系,传递一个bool值。

  介绍属性后,直接看代码吧,XML布局文件runlamp_layout.xml代码:

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" > <TextView
android:id="@+id/tvRunLamp" android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:focusable="true"
android:focusableInTouchMode="true"
android:background="#FFF"
android:textColor="#000"
android:textSize="20dp"
android:layout_margin="10dp"
android:padding="10dp"/>
</LinearLayout>

  Activity文件RunLampActivity.java代码:

 package cn.bgxt.textviewdemo;

 import android.app.Activity;
import android.os.Bundle;
import android.text.Html;
import android.text.method.LinkMovementMethod;
import android.widget.TextView; public class RunLampActivity extends Activity { private TextView tvRunLamp; public RunLampActivity() {
// TODO Auto-generated constructor stub
} @Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.runlamp_layout); tvRunLamp = (TextView) findViewById(R.id.tvRunLamp);
String html = "之前讲解Android布局的时候,就已经说明,所有<a href='http://www.cnblogs.com/plokmju/p/androidUI_Layout.html'>Layout</a>都是View的子类或者间接子类。而TextView也一样,是View的直接子类。它是一个文本显示控件,提供了基本的显示文本的功能,并且是大部分UI控件的父类,因为大部分UI控件都需要展示信息。";
CharSequence cs = Html.fromHtml(html);
tvRunLamp.setText(cs);
//因为文本中设定了一个<a>标签,这里设置响应。
tvRunLamp.setMovementMethod(LinkMovementMethod.getInstance());
}
}

  运行效果图,是一个滚动的效果:

  示例源码下载

总结

  在此就说明了Android中TextView,并且以例子的方式说明了一些常用效果的实现。因为TextView是大部分UI控件的父类,所以其内的一些属性对于其他UI控件都是通用的,可以有借鉴的地方。

  请支持原创,尊重原创,转载请注明出处。谢谢。

Android--UI之TextView的更多相关文章

  1. Android UI 之TextView控件属性列表

    在网上收集到了TextView 的属性,在开发过程中还是挺有用的. android:autoLink 设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(non ...

  2. Android经常使用UI组件 - TextView

    TextView是Android里面用的最多的UI组件,一般使用在须要显示一些信息的时候,其不能输入,仅仅能初始设定或者在程序中改动. 实例:TextViewDemo 执行效果: 代码清单: 布局文件 ...

  3. Android用户界面 UI组件--TextView及其子类(五) DigitalClock,AnalogClock,RadioButton,CheckBox,ToggleButton汇总

    DigitalClock和AnalogClock两个时钟类 可以为DigitalClock设置背景图片,自定义时针,秒针,分针的样式 例子: <?xml version="1.0&qu ...

  4. 【Android 应用开发】Android UI 设计之 TextView EditText 组件属性方法最详细解析

    . 作者 :万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . TextView 相关类的继承结构 ...

  5. Android UI控件:TextView

    TextVIew的属性详解 android:autoLink设置是否当文本为URL链接/email/电话号码/map时,文本显示为可点击的链接.可选值(none/web /email/phone/ma ...

  6. Android UI 设计之 TextView EditText 组件属性方法最详细解析

    . 作者 :万境绝尘  转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/18964835 . TextView 相关类的继承结构 ...

  7. Android UI 绘制过程浅析(五)自定义View

    前言 这已经是Android UI 绘制过程浅析系列文章的第五篇了,不出意外的话也是最后一篇.再次声明一下,这一系列文章,是我在拜读了csdn大牛郭霖的博客文章<带你一步步深入了解View> ...

  8. 【Android UI】Android开发之View的几种布局方式及实践

    引言 通过前面两篇: Android 开发之旅:又见Hello World! Android 开发之旅:深入分析布局文件&又是“Hello World!” 我们对Android应用程序运行原理 ...

  9. Android UI性能优化实战, 识别View中的性能问题

    出自:[张鸿洋的博客]来源:http://blog.csdn.net/lmj623565791/article/details/45556391 1.概述 2015年初google发布了Android ...

  10. 【Android UI设计与开发】第05期:引导界面(五)实现应用程序只启动一次引导界面

    [Android UI设计与开发]第05期:引导界面(五)实现应用程序只启动一次引导界面 jingqing 发表于 2013-7-11 14:42:02 浏览(229501) 这篇文章算是对整个引导界 ...

随机推荐

  1. IEC2017级_1-2班2次博客作业成绩说明

    一.博客作业内容 2018上IEC计算机高级语言(C)作业 第2次作业 二.评分规则说明 1.程序调试题,要描述出调试所遇到问题及修改内容,并表述清楚程序功能.流程图不规范的会减1-2分: 2.知识点 ...

  2. Java实现图片的裁剪(包括透明背景)

    需求: 有一张位置大小的图片,现在需要根据这张原图得到指定尺寸的图片,且得到的图片要符合原先图片的比例,就是在原图的基础上等比例缩放得到图片后,在进行剪裁,这样保证得到的图片是原图的一部分,而不是将原 ...

  3. 更改MAC地址,突破公司绑定MAC地址的限制

    步骤/方法 1 打开开始菜单,选择控制面板. 2   3 打开控制面板项,选择网络和共享中心. 4   5 选择更改适配器设置. 6   7 选择本地要修改MAC地址的网卡. 8   9 右键该网卡, ...

  4. spring aop 切面编程中获取具体方法的方法

    spring 切面编程中获取具体方法的方法 工作中,使用环绕通知,用来捕获异常,然后通过获取方法的返回值,返回不同的数据给到调用方. 由于方法的返回值不同,我们处理异常时,也需要返回不同的格式. 这时 ...

  5. 大众点评selfxss结合两个csrf变废为宝(已修复,故公开,不涉及真实参数)

    大众点评selfxss结合两个csrf变废为宝 漏洞不值钱,但还是蛮好玩的 漏洞信息 类型:存储型xss 场景:收藏商户后,去已收藏的商户列表可以给指定商户添加tag(与下文html标签区别) 漏洞限 ...

  6. Codeforces Round #421 (Div. 2)

    A: 题意:给你一本书共c页,第一天看v0页,第二天看v0+a,第二天看v0+2a以此类推,每天最多看v1页,但是后一天要重复看前一天的后l页. 代码: #include<stdio.h> ...

  7. git配置全局用户名

    点击右键 ,点击git bash here 在控制面板输入 git config --global user.name "xxx" git config --global user ...

  8. java.lang.OutOfMemoryError: PermGen space (jvm内存泄漏解决办法)

    2.在myeclipse根目录 打开myeclipse.ini 3.在myeclipse中配置内存

  9. 英语演讲稿——Get Along with Fear

    Hi. My name is Zhang Meng. I’m an engineer at Keysight. Today I’m not going to introduce my birthpla ...

  10. [转] The QCOW2 Image Format

    The QCOW2 Image Format https://people.gnome.org/~markmc/qcow-image-format.html The QCOW image format ...