1:显示富文本(URL、不同大小、字体、颜色的文本)
在TextView类中预定义了一些类似HTML的标签,通过这些标签,可以使TextView控件显示不同的颜色、大小、字体的文字。
<font>:设置颜色 <big>:设置大号字 <small>:设置小号字
<i>:斜体 <b>:粗体 <tt>:等宽字体(Monospace)
<br>:换行(行与行之间没有空行) <p>:换行(行与行之间的空行)
<a>:链接地址 <img>:插入图像
这些标签虽然和HTML的标签类似,但并不具备HTML标签的全部功能。如<font>标签只支持color和face两个属性。
在使用这些标签时不能将带这些标签的字符串直接赋值到TextView上,而需要使用Html.frmHtml方法将带标签的字符串转换成CharSequence对象,再赋值给TextView。
如果想在显示的文本中将URL、E-mail、电话等特殊内容高亮显示,并在单击时触发相应的动作(如单击电话会直接在拨号界面显示电话号码),
可以设置<TextView>标签的android:autoLink属性,该属性可设置的属性值如下:
none:不匹配任何链接(默认) web:匹配Web网址 email:匹配E-mail地址
phone:匹配电话号码 map:匹配映射地址 all:匹配所有的链接
下面是示例
- publicclassMainextendsActivity{
- <spanstyle="white-space:pre"></span>privateTextViewtxtFirst,txtSecond;
- <spanstyle="white-space:pre"></span>
- <spanstyle="white-space:pre"></span>@Override
- <spanstyle="white-space:pre"></span>publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- txtFirst=(TextView)findViewById(R.id.txtFirst);
- txtSecond=(TextView)findViewById(R.id.txtSecond);
- Stringhtml="<fontcolor='red'>样式一</font><br>";
- html+="<fontcolor='#0000FF'><big><i>样式二</i></big><font>";
- html+="<fontcolor='@"+android.R.color.white+"'><tt><b><big><u>样式三</u></big></b></tt></font><br>";
- html+="<big><ahref='http://blog.youkuaiyun.com/a_mean'>我的博客:http://blog.youkuaiyun.com/a_mean</a></big>";
- CharSequencecharSequence=Html.fromHtml(html);
- txtFirst.setText(charSequence);
- //该语句在设置后必加,不然没有任何效果
- txtFirst.setMovementMethod(LinkMovementMethod.getInstance());
- }
- }

2:显示表情图像和文字
这样的效果类似我们在网络上聊天时发出的表情和文字,我们添加一个<img>标签就可以很容易地实现。
<img>标签只有一个src属性,它指向一个图像地址或可以找到某个图像资源的唯一标识。
- publicclassMainextendsActivity{
- privateTextViewtxtSecond;
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- txtSecond=(TextView)findViewById(R.id.txtSecond);
- Stringhtml="很高兴<imgsrc='gx'/>很得意<imgsrc='dy'/>";
- CharSequencecharSequence=Html.fromHtml(html,newImageGetter(){
- @Override
- publicDrawablegetDrawable(Stringsource){
- Drawabledrawable=getResources().getDrawable(
- getResourceId(source));
- //这句话必写,不然图片是有了不过显示的面积为0.
- drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
- returndrawable;
- }
- },null);
- txtSecond.setText(charSequence);
- txtSecond.setMovementMethod(LinkMovementMethod.getInstance());
- }
- /**
- *由于无法直接使用文件名来引用res/drawable中的图像资源,我们利用反射技术从R.drawable类中通过图像资源文件名,
- *去获得相应的图像资源ID,实现代码如下:
- */
- publicstaticintgetResourceId(Stringname){
- intid=0;
- try{
- Fieldfield=R.drawable.class.getField(name);
- id=Integer.parseInt(field.get(null).toString());
- }catch(Exceptione){
- e.printStackTrace();
- }
- returnid;
- }
- }
3:单击链接弹出Activity
上面我们已经学会了使用让TextView自动识别的特殊文本,但要是我们想在单击TextView时执行我们自定义的动作要怎么办呢?
- publicclassMainextendsActivity{
- privateTextViewtxtSecond;
- @Override
- publicvoidonCreate(BundlesavedInstanceState){
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- txtSecond=(TextView)findViewById(R.id.txtSecond);
- Stringtext="单击弹出Activity";
- SpannableStringspannableString=newSpannableString(text);
- //把text中的所有文本设置成ClickableSpan对象,并实现onClick方法
- spannableString.setSpan(newClickableSpan(){
- @Override
- publicvoidonClick(Viewwidget){
- //这里做我们自定义的动作
- Intentintent=newIntent(Main.this,Test.class);
- startActivity(intent);
- }
- /**解释一下这个setSpan方法,第一个参数需要设置一个ClickableSpan对象,
- *第二个和第三个参数分别表示文本中要设置成Span的某段文本的起始位置和终止位置的下一个字符的位置
- *最后一个参数是一个标志,分别是:
- *Spannable.SPAN_EXCLUSIVE_INCLUSIVE在Span前的字符不应用Span的效果,后面的字符应用
- *Spannable.SPAN_EXCLUSIVE_EXCLUSIVE在Span前的字符应用Span的效果,后面的不应用
- *Spannable.SPAN_INCLUSIVE_INCLUSIVE在Span前后的字符都应用Span的效果
- */
- },0,text.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- txtSecond.setText(spannableString);
- txtSecond.setMovementMethod(LinkMovementMethod.getInstance());
- }
- }
4:为指定文字添加背景
有一个很常用的Span类叫BackgroundColorSpan,该类的功能是设置指定字符串的背景色:
第1步:将字符串转换成SpannableString对象
第2步:确定要设置的子字符串的start和end
第3步:创建BackgroundColorSpan对象
BackgroundColorSpan bgColorSpan=new BackgroundColorSpan(Color.RED);
第4步:使用setSpan方法将指定子字符串转换成BackgroundColorSpan对象
spannableString.setSpan(bgColorSpan,start,end,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
第5步:用SpannableString对象设置TextView控件
textView.setText(spannableString);
textView.setMovementMethod(LinkMovementMethod.getInstance());
5:带边框的TextView
Android SDK本身提供的TextView控件并不支持边框,所以要想实现这一效果的话我们可以自定义一个控件继承TextView并修改它,
当然也可以设置TextView控件的背景图,这个不作演示。
首先定义一个BorderTextView类, extends TextView 。
- publicclassBorderTextViewextendsTextView{
- publicBorderTextView(Contextcontext,AttributeSetattrs){
- super(context,attrs);
- }
- @Override
- protectedvoidonDraw(Canvascanvas){
- super.onDraw(canvas);
- //实例化一支画笔
- Paintpaint=newPaint();
- //设置所绘制的边框颜色为黑色
- paint.setColor(android.graphics.Color.WHITE);
- //绘制上边框
- canvas.drawLine(0,0,this.getWidth()-1,0,paint);
- //绘制左边框
- canvas.drawLine(0,0,0,this.getHeight()-1,paint);
- //绘制右边框
- canvas.drawLine(this.getWidth()-1,0,this.getWidth()-1,
- this.getHeight()-1,paint);
- //绘制上边框
- canvas.drawLine(0,this.getHeight()-1,this.getWidth()-1,
- this.getHeight()-1,paint);
- }
- }
<com.hm.BorderTextView
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:textColor="#000000" android:layout_margin="20dp"
android:text="BorderTextView"
/>
效果如下:
6:设置行间距
如果在TextView控件中显示了多行文本,会有一个默认的行间距。如果要更改这个默认的行间距的话,我们可以使用下面几种方式:
android:lineSpacingExtra属性设置精确的行间距。
android:lineSpacingMultiplier属性设置默认行间距的倍数。
使用Style资源设置行间距。我们需要先在res\values目录中的文件里定义一个Style:
<style name="line_space">
<item name="android:lineSpacingMultiplier">1.5</item>
</style>
下面是示例。
<?xml version="1.0" encoding="utf-8"?>
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"android:layout_width="match_parent"
- android:layout_height="match_parent">
- <TextViewandroid:text="第一行\n第二行"android:lineSpacingExtra="20dp"
- android:id="@+id/textView1"android:layout_width="wrap_content"
- android:layout_height="wrap_content"></TextView>
- <TextViewandroid:text="第三行\n第四行"
- android:lineSpacingMultiplier="1.8"android:id="@+id/textView2"
- android:layout_width="wrap_content"android:layout_height="wrap_content"></TextView>
- <TextViewandroid:text="第五行\n第六行"style="@style/line_space"android:id="@+id/textView3"
- android:layout_width="wrap_content"android:layout_height="wrap_content"></TextView>
- </LinearLayout>
以上几种方式,如果同时设置了精锐值和倍数的话,系统会以最大的一个作为行间距的距离。
7:在未显示完的文本后面加上省略号
当文本内容太多时,TextView控件一屏无法完整显示,这样有时候我们就需要在内容中加上省略号。
在TextView标签中加上android:singleLine="true",这样内容只会显示一行,然后再加上android:ellipsize="end",
这样在该行的末尾就会加上省略号了,android:ellipsize这个属性值还可以是start,middle,有兴趣的朋友可以自己试试。
我们还可以在代码中进行设置:textView.setEllipsize(TextUtils.TruncateAt.END);后面跟的是一个枚举类型。
8:走马灯效果
对于长文本的显示,除了用省略号之外我们还可以让它滚动显示,这样的效果也叫走马灯效果。
我们实现这个效果,也要用到上面android:ellipsize的属性,还有android:marqueeRepeatLimit,和android:focusable属性。
<TextView android:id="@+id/txtInfo" android:text="这里是测试内容,内容要长容要长要长长长长长长长长长长长长长长长长"
android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever"
android:focusable="true" android:focusableInTouchMode="true" android:singleLine="true"
android:layout_width="fill_parent" android:layout_height="wrap_content" />
如果有的朋友实现这个走马灯效果时发现它跑不起来,记得把android:focusableInTouchMode事件也写上就行了。
9:垂直滚动
像我们看小说时,会有很多内容要往下浏览,这时我们就要用到垂直滚动。
与垂直滚动直接相关的有下面几个属性:
android:scrollbars="vertical"该属性值必须设置为vertical
android:scrollbarStyle="outsideOverlay" 表示滚动条的位置
android:scrollbarFadeDuration="2000" 表示滚动条从出现到消失的时间,单位是毫秒。
如果你设置了这几个属性还是没有出现垂直滚动条的话,请看看你的内容android:text,只有比较长的文本才可以滚动。
好了TextView就学习到这里,明天继续学习EditText。