- Android开发权威指南(第二版)
- 李宁编著
- 1345字
- 2024-12-21 14:46:34
13.1 显示文本的控件(TextView)
如果要问最先接触到的控件是哪一个?或第一个学会的控件是哪一个?估计大多数Android开发人员的答案是TextView。这个控件我们已经再熟悉不过了,因为前面很多例子都多次使用了这个控件。TextView控件的基本使用方法很简单,在布局文件中使用<TextView>标签定义TextView控件,在Java代码中使用TextView对象操作TextView控件。下面的布局代码通过android:text属性指定在TextView控件中显示的文本。
<TextView android:id="@+id/textview1" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="设置在TextView控件中显示的文本" />
当然,还可以使用android:background、android:textColor和android:textSize属性设置TextView控件的背景颜色、文字颜色和字体大小。属性值可以是颜色值(以#开头的值)或Color资源。关于颜色值的设置读者可参阅10.4.4小节的内容。
<!-- 设置TextView控件的背景颜色、文字颜色和字体大小 -->
<TextView android:id="@+id/textview1" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:textColor="#0000FF"
android:textSize = "30sp"android:background="#FFFFFF"
android:text="设置在TextView控件中显示的文本" />
还可以使用下面的Java代码动态设置TextView控件的属性。
TextView textView = (TextView) findViewById(R.id.textview);
// 使用实际的颜色值设置文字颜色
textView.setTextColor(android.graphics.Color.RED);
// 使用图像资源设置背景色
textView.setBackgroundResource(R.color.background);
// 直接使用颜色值设置背景示
textView.setBackgroundColor(android.graphics.Color.RED);
// 使用setBackgroundDrawable方法设置背景色
Resources resources=getBaseContext().getResources();
Drawable drawable=resources.getDrawable(R.color.background);
textView.setBackgroundDrawable(drawable);
由于很多控件类(如EditText、Button)都是从TextView类继承的,因此这些控件类都拥有TextView控件的全部特性,所以很多TextView控件的属性(如android:background、android:textColor、android:textSize、android:text等)这些控件也可以使用,功能完全相同,因此在遇到这些属性时不再详细介绍。在本节会介绍一些关于TextView以及相关控件更高级的功能,以使读者可以完全掌握TextView控件中用于显示文本的技术。
13.1.1 显示富文本(URL、不同大小、字体、颜色的文本)
源代码目录:src/ch13/ShowRichtext
在TextView类中预定义了一些类似HTML的标签,通过这些标签,可以使TextView控件显示不同颜色、大小、字体的文字。下面是几个比较常用的标签。
<font>:设置颜色和字体。
<big>:设置大号字。
<small>:设置小号字。如果<big>和<small>都没有,表示正常字号。
<i>:斜体。
<b>:粗体。
<tt>:等宽字体(Monospace)。
<br>:换行(行与行之间没有空行,相当于“\n”)。
<p>:换行(行与行之间有空行,相当于“\n\n”)。对于带标签的文本,直接使用“\n”无法换行,只能使用<br>或<p>。
<a>:链接地址。
<img>:插入图像。
上面标签中的<img>将在下一节详细介绍,在本节只介绍前面几个标签的使用方法。这些标签虽然和HTML的标签类似,但并不具备HTML标签的全部功能。例如,<font>标签只支持color和face两个属性。
在使用这些标签时不能将带这些标签的字符串直接使用TextView.setText方法进行设置,而需要使用Html.fromHtml方法将带标签的字符串转换成CharSequence对象,然后再使用TextView.setText方法进行设置。
如果想在显示的文本中将URL地址、E-mail地址、电话等特殊内容高亮显示,并在单击时触发相应的动作(URL地址会调用浏览器显示该网址,电话会直接在拨号界面显示电话号),可以设置<TextView>标签的android:autoLink属性,该属性可设置的值如表13-1所示。
表13-1 android:autoLink属性可设置的值
可以根据需要设置android:autoLink属性的值,如果想匹配所有的特殊字符串,就将android:autoLink属性值设为all。
下面来看一个例子,先在布局文件中放两个<TextView>标签,代码如下:
源代码文件:src/ch13/ShowRichtext/res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<!-- 用于显示不同颜色、字体、大小的文字 -->
<TextView android:id="@+id/textview1" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:padding="20dp" />
<!-- 用于显示带URL地址、E-mail地址、电话号的文本 -->
<TextView android:id="@+id/textview2" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:textSize="20sp"
android:autoLink="all" android:padding="2dp" />
</LinearLayout>
上面代码中的第2个<TextView>标签将android:autoLink属性值设为all,表示匹配所有特殊的文本。下面我们用代码来为这两个TextView控件赋值。
源代码文件:src/ch13/ShowRichtext/src/mobile/android/show/richtext/Main.java
public class Main extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 从布局文件装载并创建两个TextView对象
TextView textView1 = (TextView) findViewById(R.id.textview1);
TextView textView2 = (TextView) findViewById(R.id.textview2);
// 设置第一个TextView要显示的文本(带预定义标签的字符串)
String html = "<font color='red'>I love Android.</font><br>";
html += "<font color='#0000FF' ><big><i>I love Android.</i></big></font><p>";
html += "<font color='@" + android.R.color.white+ "' ><tt><b><big><u>I love
Android.</u></big><b></tt></font><p>";
html += "<big><a href='http://51happyblog.com'>我的网站:51happyblog.com</a> </big>";
// 将带预定义标签的字符串转换成CharSequence对象
CharSequence charSequence = Html.fromHtml(html);
// 为第一个TextView控件设置要显示的文本
textView1.setText(charSequence);
// 下面的语句非常重要,没有该语句,无法单击链接调用浏览器显示网页
textView1.setMovementMethod(LinkMovementMethod.getInstance());
// 设置第二个TextView控件要显示的文本
String text = "我的URL:http://51happyblog.com\n";
text += "我的Email:abcd@126.com\n";
text += "我的电话:+86 024-12345678";
textView2.setText(text);
textView2.setMovementMethod(LinkMovementMethod.getInstance());
}
}
运行本例,显示效果如图13-1所示。
注意
在调用textview1.setText方法设置完文本后,还需要调用textview1.setMovement Method方法设置一个MovementMethod对象。由于在本例中<a>标签是链接,因此,需要使用LinkMovementMethod.getInstance方法获得MovementMethod对象。该对象可以使单击链接时调用浏览器显示指定的网页。如果不设置MovementMethod对象,虽然可以正常显示<a>标签指定的链接,但单击链接后无任何反应。
▲图13-1 显示不同颜色、字体、大小的文本
13.1.2 用<img>标签在TextView控件上显示图像
源代码目录:src/ch13/TextImage
有很多读者使用过腾迅QQ for Android。在QQ的聊天界面,无论是在输入聊天内容的EditText(将在13.2节详细介绍),还是在显示聊天内容的列表(主要使用TextView显示),都可以使用图文混排的方式显示内容,效果如图13-2所示。
▲图13-2 QQ 中显示聊天内容
很多初学者可能认为在TextView或EditText中同时显示图像很复杂,实现起来也很困难,其实恰好相反,向TextView或EditText中添加图像只比直接添加文本复杂一点点,而且就用上一节节提及的<img>标签就可以很容易实现。
<img>标签只有一个src属性,该属性原则上应该指向一个图像地址或可以找到某个图像资源的唯一标识。但要注意的是,系统并不会直接根据src属性的值自动显示图像,显示图像的工作要用代码来完成。也就是说,src属性值的含义只有设置它的开发人员才知道。解析src属性值的工作需要在ImageGetter.getDrawable方法中完成。ImageGetter是一个接口,也许很多读者对这个接口比较陌生,但使用过Html.fromHtml方法的如下重载形式就会比较熟悉它。
public static Spanned fromHtml(String source, ImageGetter imageGetter,TagHandler tagHandler);
fromHtml方法有如下3个参数。
source:包含Html标签(上一节介绍的标签)的字符串。
imageGetter:ImageGetter对象。当系统解析到<img>标签时就会调用ImageGetter.getDrawable方法,并将src属性值传入getDrawable方法。至于src属性值的具体含义,就要在getDrawable方法中确定了。getDrawable方法返回一个Drawable对象,可以从res/drawable资源、SD卡或网络获得图像资源,并封装成Drawable对象。
tagHandler:TagHandler对象。这个参数并不常用,当系统处理每一个标签时都会调用TagHandler.handleTag方法。如果不使用该参数,可将该参数值设为null。
下面来看一个例子。先准备5个图像文件,分别是image1.png、image2.png、image3.png、image4.png和image5.png,图像分辨率都是4848(可以更大或更小),这5个图像文件都放在res/drawable目录中。
这个例子是在一个TextView控件中使用<img>标签以不同的大小显示这5个图像,并在其中插入相应的文字,本例的完整代码如下:
源代码文件:src/ch13/TextImage/src/mobile/android/text/image/Main.java
public class Main extends Activity
{
// 利用Java反射技术从R.drawable类中获取资源ID
public int getResourceId(String name)
{
try
{
// 根据资源ID名(也就是图像资源的文件名)获得Field对象
Field field = R.drawable.class.getField(name);
// 取得并返回资源ID
return Integer.parseInt(field.get(null).toString());
}
catch (Exception e)
{
}
return 0;
}
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView textView = (TextView) findViewById(R.id.textview);
textView.setTextColor(Color.BLACK);
textView.setBackgroundColor(Color.WHITE);
textView.setTextSize(20);
// 定义并初始化一个带<img>标签的字符串
String html = "图像1<img src='image1'/>图像2<img src='image2'/>图像3<img src='image3'/><p>";
html += "图像4<a href='http://51happyblog.com'><img src='image4'/></a>图像5<img src='image5'/>";
// 调用Html.fromHtml方法处理<img>标签,将src属性值转换为图像(Drawable对象)
CharSequence charSequence = Html.fromHtml(html, new ImageGetter()
{
@Override
public Drawable getDrawable(String source)
{
Drawable drawable = getResources().getDrawable(
getResourceId(source));
// 第3个图像文件按50%等比压缩显示(24 * 24)
if (source.equals("image3"))
drawable.setBounds(0, 0, drawable.getIntrinsicWidth() / 2,
drawable.getIntrinsicHeight() / 2);
else //其他的图像文件按原大小显示
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight() );
return drawable;
}
}, null);
textView.setText(charSequence);
// 只要使用了<a>标签,就需要设置MovementMethod对象,否则<a>标签除了显示效果,
// 并不起任何作用
textView.setMovementMethod(LinkMovementMethod.getInstance());
}
}
在编写本例时应了解如下几点。
由于无法直接通过文件名访问res/drawable目录中的图像资源,所以本例在getResourceId方法中利用Java反射技术获取与图像文件名对应的资源ID。
<img>标签的src属性只相当于一个标识,需要在ImageGetter.getDrawable方法中根据src属性值确定图像的具体位置,并将图像封装在Drawable对象中后返回该对象。
在ImageGetter.getDrawable方法中必须使用Drawable.setBounds方法设置图像的显示区域,否则图像无法显示。setBounds方法前两个参数表示图像显示区域的左上角坐标,后两个参数表示图像区域的宽度和高度。
如果TextView中显示响应链接动作的图像,需要调用TextView.setMovementMethod方法设置LinkMovementMethod对象,否则单击链接后无任何反应。
现在运行本例,显示的效果如图13-3所示。
▲图13-3 图文混排的效果
技巧点拨:使Eclipse的代码编辑器变得更智能
我们在前面已使用过很多Android SDK中的类或接口,但有时可能会忘记这些类或接口的全名是什么,只是记得头几个字母。虽然在Eclipse中输入变量、类或接口后再输入一个点(.),会自动列出所有的成员,但输入变量、类或接口时却不智能,当然,可以通过Content Assist快捷键来显示当前可能输入的内容列表,但这毕竟比较麻烦(总需要使用快捷键)。使用过Visual Studio高版本的读者会发现在Visual Studio中每输入一个字符都会自动显示提示输入的列表,幸运的是,这样的功能在Eclipse中也可以实现。单击“Window”>“Preferences”菜单项,打开“Preferences”对话框,在左侧的树中选中“Java”>“Editor”>“Content Assist”节点,在右侧下方会出现如图13-4所示的设置项。找到“Auto activation triggers for Java”输入框,在该输入框中默认只有一个点(.)(这下各位读者知道为什么输入“.”后会自动显示成员列表了吧),在“.”后面输入“@abcdefghizklmnopqrstuvwxyz”,保存设置后,在Java代码编辑器中输入a至z或@(用于Java注释)后就会自动显示用于辅助输入的列表了。如果还想在输入其他字符时也显示辅助列表,可以在该文本框中输入这些字符。
▲图13-4 设置显示辅助列表的字符
13.1.3 单击链接弹出Activity
源代码目录:src/ch13/LinkActivity
在13.1.1小节和13.1.2小节介绍了<a>标签以及TextView控件自动识别的特殊文本(网址、电话号码、E-mail等),这些都可以通过单击来触发不同的动作。虽然这些单击动作已经可以满足大多数需要了,但如果想在单击链接时执行任意自定义的动作,那么本节的内容非看不可。
首先打开Android SDK中的Html.java文件,该文件的路径如下:
<Android SDK根目录>/sources/android-17/android/text/Html.java
Html.java文件中包含了处理前两节介绍的HTML标签的核心代码,现在找到处理</a>标签的endA方法,来观察一下该方法如何使链接响应单击事件的,以便了解系统是如何处理单击动作的。
找到endA方法后,会看到该方法中包含如下的代码。
text.setSpan(new URLSpan(h.mHref), where, len,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
其中text是SpannableStringBuilder对象,该对象既可以修改文本内容,又可以将某段文本设置成一个Span,在Android中,Span表示一段文本的效果,例如,链接形式、图像、带背景色的文本等。
上面代码中使用setSpan方法将某个区间(由where和len指定的区间)的文本设置成URLSpan对象,也就是链接效果。URISpan是ClickableSpan的子类,在android.text.style包中可以找到URLSpan和ClickableSpan类。事实上,所有的Span类(类名以Span结尾的类)都在android.text.style包中。
然后按照查看Html.java文件内容的方法查看URLSpan.java文件的内容,URLSpan.java文件的路径如下:
<Android SDK根目录>/sources/android-17/android/text/style/URLSpan.java
在URLSpan.java文件中会找到一个onClick方法,代码如下:
// 覆盖ClickableSpan类中的onClick方法,onClick在ClickableSpan类中是抽象方法
@Override
public void onClick(View widget) {
Uri uri = Uri.parse(getURL());
Context context = widget.getContext();
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
context.startActivity(intent);
}
在onClick方法中获得了<a>标签的href属性设置的URL,并调用相应的窗口来显示网页。
从onClick方法的源代码以及ClickableSpan类的名字可以得出一个结论,在13.1.1小节和13.1.2小节介绍的像电话、E-mail、网址、链接都是在ClickableSpan类的onClick方法中通过Activity Action调用相应的窗口来显示不同内容的。那么我们也可以采用类似的方法,也就是自己来实现onClick方法,这样就可以达到自定义单击动作的目的了。
说做就做,先准备两个TextView控件。在本例中使用SpannableString对象来设置Span,SpannableString和SpannableStringBuilder的区别是SpannableString不允许修改文本,只允许设置Span,而SpannableStringBuilder既允许修改文本,也允许设置Span。
下面的代码采用了隐式创建ClickableSpan对象的方法来设置Span,并在其中覆盖了onClick方法。
源代码文件:src/ch13/LinkActivity/src/mobile/android/link/activity/Main.java
public class Main extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView textView1 = (TextView) findViewById(R.id.textview1);
TextView textView2 = (TextView) findViewById(R.id.textview2);
String text1 = "显示Activity1";
String text2 = "显示Activity2";
// 将文本转换成SpannableString对象
SpannableString spannableString1 = new SpannableString(text1);
SpannableString spannableString2 = new SpannableString(text2);
// 将text1中的所有文本设置成ClickableSpan对象,并实现了onClick方法
spannableString1.setSpan(new ClickableSpan()
{
// 在onClick方法中可以编写单击链接时要执行的动作
@Override
public void onClick(View widget)
{
Intent intent = new Intent(Main.this, Activity1.class);
// 显示Activity1
startActivity(intent);
}
}, 0, text1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// 将text2中的所有文本设置成ClickableSpan对象,并实现了onClick方法
spannableString2.setSpan(new ClickableSpan()
{
// 在onClick方法中可以编写单击链接时要执行的动作
@Override
public void onClick(View widget)
{
Intent intent = new Intent(Main.this, Activity2.class);
// 显示Activity2
startActivity(intent);
}
}, 0, text1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// 使用SpannableString对象设置两个TextView控件的内容
textView1.setText(spannableString1);
textView2.setText(spannableString2);
// 在单击链接时凡是有要执行的动作,都必须设置相应的MovementMethod对象
textView1.setMovementMethod(LinkMovementMethod.getInstance());
textView2.setMovementMethod(LinkMovementMethod.getInstance());
}
}
现在来看一下setSpan方法,该方法有4个参数。第1个参数需要设置一个ClicableSpan对象,第2个和第3个参数分别表示文本中要设置成Span的某段文本的起始位置和这段文本后面字符在原字符串的位置,也就是start和end,最后一个参数是一个标志。在本例中设为Spanned.SPAN_EXCLUSIVE_EXCLUSIVE,该标志在TextView控件中意义不大,但在EditText控件中表示在当前Span效果的前后输入字符时不应用Span的效果。还可以设置如下几个类似的值。
Spanned.SPAN_EXCLUSIVE_INCLUSIVE:在Span前面输入的字符不应用Span的效果,在后面输入的字符应用Span效果。
Spanned.SPAN_INCLUSIVE_EXCLUSIVE:在Span前面输入的字符应用Span的效果,在后面输入的字符不应用Span效果。
Spanned.SPAN_INCLUSIVE_INCLUSIVE:在Span前后输入的字符都应用Span的效果。
本例的显示效果如图13-5所示。单击屏幕上的两个链接后,就会分别显示Activity1和Activity2的界面。
▲图13-5 自定义单击链接的动作
13.1.4 为指定文本添加背景
源代码目录:src/ch13/TextBackground
从前面几节的内容可以得知设置字符串中的某个子字符串的样式(变成可单击的链接、设置字体等)需要如下几步。
第1步:将原字符串转换成SpannableString或SpannableStringBuilder对象。
第2步:获得要设置样式的子字符串在原字符串中的开始位置和子字符串后面的字符的位置,也就是start和end。
第3步:创建一个Span对象(所有android.text.style包中的XxxSpan类创建的对象的统称,Xxx表示URL、BackgroundColor字符串)。
第4步:使用setSpan方法设置一个Span对象,也就是说,将要设置样式的子字符串转换成Span对象。
第5步:用处理完的SpannableString或SpannableStringBuilder对象设置相应的控件(如TextView、EditText、Button等)。
在Android SDK的android.text.style包中提供了很多现成的Span类,例如,BackgroundColorSpan类就是一个很常用的Span类,该类的功能是设置指定字符串的背景色,使用方法如下:
源代码文件:src/ch13/TextBackground/src/mobile/android/text/background/Main.java
TextView textview = (TextView) findViewById(R.id.textview);
String text = "<没有背景><黄色背景>";
// 第1步:将字符串转换成SpannableString对象
SpannableString spannableString = new SpannableString(text);
// 第2步:确定要设置的子字符串的start和end
int start = 6;
int end = 12;
// 第3步:创建BackgroundColorSpan对象
BackgroundColorSpan backgroundColorSpan = new BackgroundColorSpan(Color.YELLOW);
// 第4步:使用setSpan方法将指定子字符串转换成BackgroundColorSpan对象
spannableString.setSpan(backgroundColorSpan, start, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// 第5步:用SpannableString对象设置TextView控件
textview.setText(spannableString);
BackgroundColorSpan只能设置文字的背景色,为了更加通用,需要编写一个ColorSpan类,使其同时可以设置文字颜色和背景色(android.text.style.ForegroundColorSpan类可以设置文字颜色,但并没有可同时设置背景和文字颜色的Span类)。在13.1.3小节给出了一个通过继承ClickableSpan类来编写自定义Span类的例子,不过这个例子需要处理链接动作,所以必须要继承ClickableSpan类。而本例只要设置文字和背景颜色即可,并不需要处理任何动作,因此,只需要从CharacterStyle类继承即可。实际上,ClickableSpan也是CharacterStyle的子类。可以设置文字和背景颜色的ColorSpan类的代码如下:
源代码文件:src/ch13/TextBackground/src/mobile/android/text/background/ColorSpan.java
public class ColorSpan extends CharacterStyle
{
private int mTextColor;
private int mBackgroundColor;
public ColorSpan(int textColor, int backgroundColor)
{
mTextColor = textColor;
mBackgroundColor = backgroundColor;
}
// 覆盖了CharacterStyle.updateDrawState方法,并在该方法中设置了文字和背景颜色
@Override
public void updateDrawState(TextPaint tp)
{
tp.bgColor = mBackgroundColor;
tp.setColor(mTextColor);
}
}
在ColorSpan类中实现了CharacterStyle.updateDrawState方法。该方法在系统开始绘制要设置样式的字符串之前调用,以便修改绘制文字的属性,例如,文字颜色、背景颜色等。其中TextPaint是Paint的子类。Paint类用于描述绘制的属性,如画笔的颜色、画笔的粗细等。现在同时使用BackgroundColorSpan和ColorSpan类设置文字和背景颜色,代码如下:
源代码文件:src/ch13/TextBackground/src/mobile/android/text/background/Main.java
TextView textview = (TextView) findViewById(R.id.textview);
// 定义要显示的字符串
String text = "<没有背景><黄色背景>\n\n<蓝色背景,红色文字>";
SpannableString spannableString = new SpannableString(text);
int start = 6;
int end = 12;
BackgroundColorSpan backgroundColorSpan = new BackgroundColorSpan(Color.YELLOW);
spannableString.setSpan(backgroundColorSpan, start, end,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
// <蓝色背景,红色文字>子字符串的开始位置(每一个“\n”算一个长度)
// 由于该子字符串在原字符串的最后,因此,end等于字符串的长度,也就是text.length()
start = 14;
// 创建ColorSpan对象
ColorSpan colorSpan = new ColorSpan(Color.RED, Color.BLUE);
// 将指字文本转换成ColorSpan对象
spannableString.setSpan(colorSpan, start, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textview.setText(spannableString);
本例的显示效果如图13-6所示。
▲图13-6 设置文字和背景颜色
多学一招:在XML布局文件中设置显示效果
在前面几节介绍的设置文字样式的方法基本都是通过代码实现的,只有android:autoLink属性值为true时可以识别TextView控件中可响应动作(打电话、显示网页等)的文本。那么如果不设置android:autoLink属性,而且不通过代码设置可响应动作的文本(但要使用TextView.setMovementMethod方法设置MovementMethod对象,否则单击链接时不会有任何动作),这就要使用<a>标签来实现可响应动作的文本。由于<TextView>标签的android:text属性不能设置特殊的字符,如“<”和“>”,因此,要想在android:text属性中设置这些特殊字符,需要使用字符串资源。
在strings.xml文件中加入如下的代码。
<string name="link_text">
<a href="tel:12345678">打电话</a>
</string>
然后在<TextView>标签的android:text属性中引用这个字符串资源(不要设置android:autoLink属性),代码如下:
<TextView android:id="@+id/textview2" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:textSize="20sp"
android:padding="20dp" android:text="@string/link_text" />
这时就会在屏幕上显示“打电话”的链接,单击该链接会弹出拨打电话的界面,并在电话输入框中显示“1-234-5678”。
归纳总结:设置文本样式的4种方法
(1)将android:autoLink属性值设为true,系统会自动识别E-mail、电话、网址等特殊文本。
(2)使用样式标签,例如,<font>、<img>等。不需要设置android:autoLink属性,但要在Java代码中使用Html.fromHtml方法将包含样式标签的字符串转换为CharSequence对象。
(3)在Java代码中直接使用Span对象来设置文本样式。这种方法需要将文本转换成一个SpannableString或SpannableStringBuilder对象,然后使用SpannableString.setSpan或SpannableStringBuilder.setSpan方法将要设置样式的文本转换成相应的Span对象。
(4)在字符串资源中使用<a>标签(只支持<a>标签)设置可相应动作的文本。不要设置控件标签的android:audoLink属性。
上面4种方法只要涉及单击动作,就必须使用TextView.setMovementMethod方法设置相应的MovementMethod对象。