Android開發(fā)技巧之在a標(biāo)簽或TextView控件中單擊鏈接彈出Activity(自定義動(dòng)作)
更新時(shí)間:2013年01月22日 10:38:39 作者:
a標(biāo)簽以及TextView自動(dòng)識(shí)別的特殊文本(網(wǎng)址、電話號(hào)、Email等),這些都可以通過單擊來觸發(fā)不同的動(dòng)作;但如果讀者想在單擊鏈接時(shí)執(zhí)行任意自定義的動(dòng)作,那么將要介紹的一定是你想要的了
在5.2.1節(jié)和5.2.2節(jié)介紹了<a>標(biāo)簽以及TextView自動(dòng)識(shí)別的特殊文本(網(wǎng)址、電話號(hào)、Email等),這些都可以通過單擊來觸發(fā)不同的動(dòng)作。雖然這些單擊動(dòng)作已經(jīng)可以滿足大多數(shù)需要了,但如果讀者想在單擊鏈接時(shí)執(zhí)行任意自定義的動(dòng)作,那么本節(jié)的內(nèi)容非看不可。
現(xiàn)在讓我們使用5.2.1節(jié)介紹的方法重新查看Html.java文件的內(nèi)容,隨便找一個(gè)處理Html標(biāo)簽的方法,例
如,endA方法。該方法用于處理</a>標(biāo)簽。我們會(huì)發(fā)現(xiàn)在該方法中如下的語句。
text.setSpan(newURLSpan(h.mHref),where,len,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
其中text是SpannableStringBuilder對(duì)象,該對(duì)象即可以修改文本內(nèi)容,又可以將某段文本設(shè)置成一個(gè)Span,在Android中,Span表示一段文本的效果,例如,鏈接形式、圖像、帶背景色的文本等。
上面代碼中使用setSpan方法將某個(gè)區(qū)間(由where和len指定的區(qū)間)的文本設(shè)置成URLSpan效果,也就是鏈接顯示效果。其中URLSpan表示將文本設(shè)置成鏈接效果,該類是ClickableSpan的子類,在android.text.style包中可以找到URLSpan和ClickableSpan類。實(shí)際上,所有的Span類都在android.text.style包中。
我們?cè)侔粗榭碒tml.java文件內(nèi)容的方法查看URLSpan.java文件的內(nèi)容,會(huì)看到一個(gè)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>標(biāo)簽的href屬性設(shè)置的URL,并調(diào)用相應(yīng)的Activity來顯示網(wǎng)頁。
從onClick方法的源代碼以及ClickableSpan類的名字可以得出一個(gè)結(jié)論。在5.2.1節(jié)和5.2.2節(jié)介紹的像電話、Email、網(wǎng)址、鏈接都是在ClickableSpan類的onClick方法中通過Action調(diào)用相應(yīng)的Activity來顯示不同的內(nèi)容的。那么我們也可以采用類似的方法,也就是自己來實(shí)現(xiàn)onClick方法,這樣就可以達(dá)到自定義單擊動(dòng)作的目的了。
說做就做,先準(zhǔn)備兩個(gè)TextView控件。在本例中我們使用SpannableString對(duì)象來設(shè)置Span,SpannableString和SpannableStringBuilder的區(qū)別是SpannableString不允許修改文本,只允許設(shè)置Span,而SpannableStringBuilder即允許修改文本,也允許設(shè)置Span。
下面的代碼采用了隱式創(chuàng)建ClickableSpan對(duì)象實(shí)例的方法來設(shè)置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";
//將文本轉(zhuǎn)換成SpannableString對(duì)象
SpannableStringspannableString1=newSpannableString(text1);
SpannableStringspannableString2=newSpannableString(text2);
//將text1中的所有文本設(shè)置成ClickableSpan對(duì)象,并實(shí)現(xiàn)了onClick方法
spannableString1.setSpan(newClickableSpan()
{
//在onClick方法中可以編寫單擊鏈接時(shí)要執(zhí)行的動(dòng)作
@Override
publicvoidonClick(Viewwidget)
{
Intentintent=newIntent(Main.this,Activity1.class);
//顯示Activity1
startActivity(intent);
}
},0,text1.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//將text2中的所有文本設(shè)置成ClickableSpan對(duì)象,并實(shí)現(xiàn)了onClick方法
spannableString2.setSpan(newClickableSpan()
{
//在onClick方法中可以編寫單擊鏈接時(shí)要執(zhí)行的動(dòng)作
@Override
publicvoidonClick(Viewwidget)
{
Intentintent=newIntent(Main.this,Activity2.class);
//顯示Activity2
startActivity(intent);
}
},0,text1.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//使用SpannableString對(duì)象設(shè)置兩個(gè)TextView控件的內(nèi)容
textView1.setText(spannableString1);
textView2.setText(spannableString2);
//在單擊鏈接時(shí)凡是有要執(zhí)行的動(dòng)作,都必須設(shè)置MovementMethod對(duì)象
textView1.setMovementMethod(LinkMovementMethod.getInstance());
textView2.setMovementMethod(LinkMovementMethod.getInstance());
}
}
現(xiàn)在我們來看一下setSpan方法,該方法有4個(gè)參數(shù)。第一個(gè)參數(shù)需要設(shè)置一個(gè)ClicableSpan對(duì)象,第二個(gè)和第三個(gè)參數(shù)分別表示文本中要設(shè)置成Span的某段文本的起始位置和終止位置的下一個(gè)字符的位置,也就是start和end。最后一個(gè)參數(shù)是一個(gè)標(biāo)志。在本例中設(shè)為Spanned.SPAN_EXCLUSIVE_EXCLUSIVE,該標(biāo)志在TextView控件中意義不大,但在EditText控件中表示在當(dāng)前Span效果的前后輸入字符時(shí)并不應(yīng)用Span的效果。還可以設(shè)置如下幾個(gè)類似的值。
1.Spanned.SPAN_EXCLUSIVE_INCLUSIVE:在Span前面輸入的字符不應(yīng)用Span的效果,在后面輸入的字符應(yīng)用Span效果。
2.Spanned.SPAN_INCLUSIVE_EXCLUSIVE:在Span前面輸入的字符應(yīng)用Span的效果,在后面輸入的字符不應(yīng)用Span效果。
3.Spanned.SPAN_INCLUSIVE_INCLUSIVE:在Span前后輸入的字符都應(yīng)用Span的效果。
本例的顯示效果如圖5.5所示。單擊屏幕上的兩個(gè)鏈接后,就會(huì)分別顯示Activity1和Activity2的界面。
現(xiàn)在讓我們使用5.2.1節(jié)介紹的方法重新查看Html.java文件的內(nèi)容,隨便找一個(gè)處理Html標(biāo)簽的方法,例
如,endA方法。該方法用于處理</a>標(biāo)簽。我們會(huì)發(fā)現(xiàn)在該方法中如下的語句。
text.setSpan(newURLSpan(h.mHref),where,len,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
其中text是SpannableStringBuilder對(duì)象,該對(duì)象即可以修改文本內(nèi)容,又可以將某段文本設(shè)置成一個(gè)Span,在Android中,Span表示一段文本的效果,例如,鏈接形式、圖像、帶背景色的文本等。
上面代碼中使用setSpan方法將某個(gè)區(qū)間(由where和len指定的區(qū)間)的文本設(shè)置成URLSpan效果,也就是鏈接顯示效果。其中URLSpan表示將文本設(shè)置成鏈接效果,該類是ClickableSpan的子類,在android.text.style包中可以找到URLSpan和ClickableSpan類。實(shí)際上,所有的Span類都在android.text.style包中。
我們?cè)侔粗榭碒tml.java文件內(nèi)容的方法查看URLSpan.java文件的內(nèi)容,會(huì)看到一個(gè)onClick方法,代碼如下:
復(fù)制代碼 代碼如下:
//覆蓋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>標(biāo)簽的href屬性設(shè)置的URL,并調(diào)用相應(yīng)的Activity來顯示網(wǎng)頁。
從onClick方法的源代碼以及ClickableSpan類的名字可以得出一個(gè)結(jié)論。在5.2.1節(jié)和5.2.2節(jié)介紹的像電話、Email、網(wǎng)址、鏈接都是在ClickableSpan類的onClick方法中通過Action調(diào)用相應(yīng)的Activity來顯示不同的內(nèi)容的。那么我們也可以采用類似的方法,也就是自己來實(shí)現(xiàn)onClick方法,這樣就可以達(dá)到自定義單擊動(dòng)作的目的了。
說做就做,先準(zhǔn)備兩個(gè)TextView控件。在本例中我們使用SpannableString對(duì)象來設(shè)置Span,SpannableString和SpannableStringBuilder的區(qū)別是SpannableString不允許修改文本,只允許設(shè)置Span,而SpannableStringBuilder即允許修改文本,也允許設(shè)置Span。
下面的代碼采用了隱式創(chuàng)建ClickableSpan對(duì)象實(shí)例的方法來設(shè)置Span,并在其中覆蓋了onClick方法。
復(fù)制代碼 代碼如下:
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";
//將文本轉(zhuǎn)換成SpannableString對(duì)象
SpannableStringspannableString1=newSpannableString(text1);
SpannableStringspannableString2=newSpannableString(text2);
//將text1中的所有文本設(shè)置成ClickableSpan對(duì)象,并實(shí)現(xiàn)了onClick方法
spannableString1.setSpan(newClickableSpan()
{
//在onClick方法中可以編寫單擊鏈接時(shí)要執(zhí)行的動(dòng)作
@Override
publicvoidonClick(Viewwidget)
{
Intentintent=newIntent(Main.this,Activity1.class);
//顯示Activity1
startActivity(intent);
}
},0,text1.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//將text2中的所有文本設(shè)置成ClickableSpan對(duì)象,并實(shí)現(xiàn)了onClick方法
spannableString2.setSpan(newClickableSpan()
{
//在onClick方法中可以編寫單擊鏈接時(shí)要執(zhí)行的動(dòng)作
@Override
publicvoidonClick(Viewwidget)
{
Intentintent=newIntent(Main.this,Activity2.class);
//顯示Activity2
startActivity(intent);
}
},0,text1.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//使用SpannableString對(duì)象設(shè)置兩個(gè)TextView控件的內(nèi)容
textView1.setText(spannableString1);
textView2.setText(spannableString2);
//在單擊鏈接時(shí)凡是有要執(zhí)行的動(dòng)作,都必須設(shè)置MovementMethod對(duì)象
textView1.setMovementMethod(LinkMovementMethod.getInstance());
textView2.setMovementMethod(LinkMovementMethod.getInstance());
}
}
現(xiàn)在我們來看一下setSpan方法,該方法有4個(gè)參數(shù)。第一個(gè)參數(shù)需要設(shè)置一個(gè)ClicableSpan對(duì)象,第二個(gè)和第三個(gè)參數(shù)分別表示文本中要設(shè)置成Span的某段文本的起始位置和終止位置的下一個(gè)字符的位置,也就是start和end。最后一個(gè)參數(shù)是一個(gè)標(biāo)志。在本例中設(shè)為Spanned.SPAN_EXCLUSIVE_EXCLUSIVE,該標(biāo)志在TextView控件中意義不大,但在EditText控件中表示在當(dāng)前Span效果的前后輸入字符時(shí)并不應(yīng)用Span的效果。還可以設(shè)置如下幾個(gè)類似的值。
1.Spanned.SPAN_EXCLUSIVE_INCLUSIVE:在Span前面輸入的字符不應(yīng)用Span的效果,在后面輸入的字符應(yīng)用Span效果。
2.Spanned.SPAN_INCLUSIVE_EXCLUSIVE:在Span前面輸入的字符應(yīng)用Span的效果,在后面輸入的字符不應(yīng)用Span效果。
3.Spanned.SPAN_INCLUSIVE_INCLUSIVE:在Span前后輸入的字符都應(yīng)用Span的效果。
本例的顯示效果如圖5.5所示。單擊屏幕上的兩個(gè)鏈接后,就會(huì)分別顯示Activity1和Activity2的界面。
您可能感興趣的文章:
- Android實(shí)現(xiàn)3D標(biāo)簽云效果
- Android自定義控件ViewGroup實(shí)現(xiàn)標(biāo)簽云(四)
- 解析在Android中為TextView增加自定義HTML標(biāo)簽的實(shí)現(xiàn)方法
- Android中使用include標(biāo)簽和merge標(biāo)簽重復(fù)使用布局
- android nfc常用標(biāo)簽讀取總結(jié)
- android配合viewpager實(shí)現(xiàn)可滑動(dòng)的標(biāo)簽欄示例分享
- Android TextView顯示Html類解析的網(wǎng)頁和圖片及自定義標(biāo)簽用法示例
- Android實(shí)現(xiàn)熱門標(biāo)簽的流式布局
- Android入門之ActivityGroup+GridView實(shí)現(xiàn)Tab分頁標(biāo)簽的方法
- Android實(shí)現(xiàn)3D標(biāo)簽云簡單效果
相關(guān)文章
Android實(shí)現(xiàn)圓角ListView效果
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)圓角ListView效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10
Android使用TabLayou+fragment+viewpager實(shí)現(xiàn)滑動(dòng)切換頁面效果
這篇文章主要介紹了Android使用TabLayou+fragment+viewpager實(shí)現(xiàn)滑動(dòng)切換頁面效果,需要的朋友可以參考下2017-05-05
Android之內(nèi)置和外置sdcard路徑顯示并且寫入數(shù)據(jù)的方法
今天小編就為大家分享一篇Android之內(nèi)置和外置sdcard路徑顯示并且寫入數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-08-08
Android開發(fā)vsts?agent支持自定義task過程詳解
這篇文章主要介紹了Android開發(fā)vsts?agent支持自定義task過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04
Android開發(fā)中的Surface庫及用其制作播放器UI的例子
這篇文章主要介紹了Android開發(fā)中的Surface庫及用其制作播放器界面的例子,利用SurfaceView和SurfaceHolder可以高效地繪制和控制圖形界面,需要的朋友可以參考下2016-04-04
Android canvas畫圖操作之切割畫布實(shí)現(xiàn)方法(clipRect)
這篇文章主要介紹了Android canvas畫圖操作之切割畫布實(shí)現(xiàn)方法,通過clipRect方法實(shí)現(xiàn)canvas畫布的切割操作,需要的朋友可以參考下2016-10-10

