Android开发技巧之在a标签或TextView控件中单击链接弹出Activity(自定义动作)

时间:2022-06-24 07:10:01

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

现在让我们使用5.2.1节介绍的方法重新查看html.java文件的内容,随便找一个处理html标签的方法,例
如,enda方法。该方法用于处理</a>标签。我们会发现在该方法中如下的语句。

text.setspan(newurlspan(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
publicvoidonclick(viewwidget){
uriuri=uri.parse(geturl());
contextcontext=widget.getcontext();
intentintent=newintent(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方法。

复制代码 代码如下:


packagemobile.android.ch05.link.activity;
importandroid.app.activity;
importandroid.content.intent;
importandroid.os.bundle;
importandroid.text.spannablestring;
importandroid.text.spanned;
importandroid.text.method.linkmovementmethod;
importandroid.text.style.clickablespan;
importandroid.view.view;
importandroid.widget.textview;
publicclassmainextendsactivity
{
@override
publicvoidoncreate(bundlesavedinstancestate)
{
super.oncreate(savedinstancestate);
setcontentview(r.layout.main);
textviewtextview1=(textview)findviewbyid(r.id.textview1);
textviewtextview2=(textview)findviewbyid(r.id.textview2);
stringtext1="显示activity1";
stringtext2="显示activity2";
//将文本转换成spannablestring对象
spannablestringspannablestring1=newspannablestring(text1);
spannablestringspannablestring2=newspannablestring(text2);
//将text1中的所有文本设置成clickablespan对象,并实现了onclick方法
spannablestring1.setspan(newclickablespan()
{
//在onclick方法中可以编写单击链接时要执行的动作
@override
publicvoidonclick(viewwidget)
{
intentintent=newintent(main.this,activity1.class);
//显示activity1
startactivity(intent);
}
},0,text1.length(),spanned.span_exclusive_exclusive);
//将text2中的所有文本设置成clickablespan对象,并实现了onclick方法
spannablestring2.setspan(newclickablespan()
{
//在onclick方法中可以编写单击链接时要执行的动作
@override
publicvoidonclick(viewwidget)
{
intentintent=newintent(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的界面。
Android开发技巧之在a标签或TextView控件中单击链接弹出Activity(自定义动作)