欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

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

程序员文章站 2023-12-01 08:21:58
在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(自定义动作)