Android開發技巧之在a標籤或TextView控制元件中單擊連結彈出Activity(自定義動作)

Android開發技巧之在a標籤或TextView控制元件中單擊連結彈出Activity(自定義動作)

在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實現3D標籤雲效果Android自定義控制元件ViewGroup實現標籤雲(四)解析在Android中為TextView增加自定義HTML標籤的實現方法Android中使用include標籤和merge標籤重複使用佈局android nfc常用標籤讀取總結android配合viewpager實現可滑動的標籤欄示例分享Android TextView顯示Html類解析的網頁和圖片及自定義標籤用法示例Android實現熱門標籤的流式佈局Android入門之ActivityGroup GridView實現Tab分頁標籤的方法Android實現3D標籤雲簡單效果