展会信息港展会大全

Android开发技巧:在TextView控件中单击链接弹出Activity
来源:互联网   发布日期:2015-11-25 22:26:40   浏览:1338次  

导读: 在5.2.1节和5.2.2节介绍了<a>标签以及TextView自动识别的特殊文本(网址、电话号、Email等),这些都可以通过单击来触发不同的动作。虽然这些单击动作已经可以满足大多数...

在5.2.1节和5.2.2节介绍了<a>标签以及TextView自动识别的特殊文本(网址、电话号、Email等),这些都可以通过单击来触发不同的动作。虽然这些单击动作已经可以满足大多数需要了,但如果读者想在单击链接时执行任意自定义的动作,那么本节的内容非看不可。

现在让我们使用5.2.1节介绍的方法重新查看Html.java文件的内容,随便找一个处理Html标签的方法,例

如,endA方法。该方法用于处理</a>标签。我们会发现在该方法中如下的语句。

text.setSpan(new URLSpan(h.mHref), where, len, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

其中text是SpannableStringBuilder对象,该对象即可以修改文本内容,又可以将某段文本设置成一个Span,在Android中,Span表示一段文本的效果,例如,链接形式、图像、带背景色的文本等。

上面代码中使用setSpan方法将某个区间(由where和len指定的区间)的文本设置成URLSpan效果,也就是链接显示效果。其中URLSpan表示将文本设置成链接效果,该类是ClickableSpan的子类,在android.text.style包中可以找到URLSpan和ClickableSpan类。实际上,所有的Span类都在android.text.style包中。

我们再按着查看Html.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,并调用相应的Activity来显示网页。

从onClick方法的源代码以及ClickableSpan类的名字可以得出一个结论。在5.2.1节和5.2.2节介绍的像电话、Email、网址、链接都是在ClickableSpan类的onClick方法中通过Action调用相应的Activity来显示不同的内容的。那么我们也可以采用类似的方法,也就是自己来实现onClick方法,这样就可以达到自定义单击动作的目的了。

说做就做,先准备两个TextView控件。在本例中我们使用SpannableString对象来设置Span,SpannableString和SpannableStringBuilder的区别是SpannableString不允许修改文本,只允许设置Span,而SpannableStringBuilder即允许修改文本,也允许设置Span。

下面的代码采用了隐式创建ClickableSpan对象实例的方法来设置Span,并在其中覆盖了onClick方法。

package mobile.android.ch05.link.activity;

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 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个参数。第一个参数需要设置一个ClicableSpan对象,第二个和第三个参数分别表示文本中要设置成Span的某段文本的起始位置和终止位置的下一个字符的位置,也就是start和end。最后一个参数是一个标志。在本例中设为Spanned.SPAN_EXCLUSIVE_EXCLUSIVE,该标志在TextView控件中意义不大,但在EditText控件中表示在当前Span效果的前后输入字符时并不应用Span的效果。还可以设置如下几个类似的值。

1.Spanned.SPAN_EXCLUSIVE_INCLUSIVE:在Span前面输入的字符不应用Span的效果,在后面输入的字符应用Span效果。

2.Spanned.SPAN_INCLUSIVE_EXCLUSIVE:在Span前面输入的字符应用Span的效果,在后面输入的字符不应用Span效果。

3.Spanned.SPAN_INCLUSIVE_INCLUSIVE:在Span前后输入的字符都应用Span的效果。

本例的显示效果如图5.5所示。单击屏幕上的两个链接后,就会分别显示Activity1和Activity2的界面。

图5.5自定义单击链接的动作

赞助本站

人工智能实验室

相关热词: android开发 教程

AiLab云推荐
推荐内容
展开

热门栏目HotCates

Copyright © 2010-2024 AiLab Team. 人工智能实验室 版权所有    关于我们 | 联系我们 | 广告服务 | 公司动态 | 免责声明 | 隐私条款 | 工作机会 | 展会港