android:SpannableString的應用,TextView中某些文字的點選事件

在這篇文章中點選開啟連結 我已經解釋了關於SpannableString如何應用

各種的Span就是通過SpannableString來封裝樣式的,設定完Span之後需要將Span放入到SpannableString類中,然後SpannableString設定到TextView中去。

在這裡就寫一個小例子。

通過使用SpannableString類,來實現在Activity中點選某些文字進入到另外一個Activity,當然其它效果也可以,比如顯示一個對話方塊,詳細資訊什麼的,看個人愛好。我理解的 就是一個點選事件。。別噴我、、

好了 ,廢話不說。

首先在xml佈局檔案中新增一個TextView控制元件併為其新增ID

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@ id/tv_intent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="HelloWord" />
</LinearLayout>

在MainActivity中,首先new一個SpannableString物件


SpannableString spannableString=new SpannableString(CharSequence);


我們發現括號裡面的引數是CharSequence大家都知道String是它的子類。其實這裡也就是我們要設定在TextView的文字內容。我們就建立一個String物件就好了。

	String text="我是蘇蘇,開啟另外一個Activity吧";

設定了這些還沒完。上面已經說了各種的Span就是通過SpannableString來封裝樣式的,設定完Span之後需要將Span放入到SpannableString類中,然後SpannableString設定到TextView中去。

我們還要把Span放入到SpannableString

用到這個方法


spannableString.setSpan(Object what,int start,int end,int flags);

what是Object類。而剩餘的三個都是int型,所以what肯定是span物件,上面說了我們要實現的是TextView的點選事件,所以這裡就寫上new ClickableSpan(),裡面方法就用ctrl 1來新增。star就是我們要實現點選事件的文字的起始下標,end是結束的下標。最後一個flags是一個輔助作用。什麼意思呢?就是點選的文字範圍包含不包含端點,這裡的端點就是star和end.第三個引數有這些 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
— 不包含start和end所在的端點   (star,end) Spanned.SPAN_EXCLUSIVE_INCLUSIVE — 不包含端start,但包含end所在的端點(star,end]  Spanned.SPAN_INCLUSIVE_EXCLUSIVE — 包含start,但不包含end所在的端點   [star,end)             Spanned.SPAN_INCLUSIVE_INCLUSIVE— 包含start和end所在的端點  [star,end],我們在這裡用的是包含端點 Spannable.SPAN_EXCLUSIVE_EXCLUSIVE

我已經設定了String text=”我是蘇蘇,開啟另外一個Activity吧”.我想從‘打’開始,‘吧’結束的文字有點選效果。

那麼star=5,end=text.length();

具體程式碼如下


spannableString.setSpan(new ClickableSpan() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
startActivity(new Intent(MainActivity.this,NewActivity.class));
}
}, 5, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

然後把SpannableString設定到TextView中去。

tv_intent.setText(spannableString);


設定完這些還不算完,為了響應文字的點選效果還要繼續設定

tv_intent.setMovementMethod(LinkMovementMethod.getInstance());

這句話僅僅是為了響應點選效果。

附上執行結果。

大家看到了下標為star和end的都能響應點選事件。

完整程式碼:

package com.example.textview;
import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.method.LinkMovementMethod;
import android.text.method.MovementMethod;
import android.text.style.ClickableSpan;
import android.view.Menu;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private TextView tv_intent;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv_intent=(TextView) findViewById(R.id.tv_intent);
String text="我是蘇蘇,開啟另外一個Activity吧";
SpannableString spannableString=new SpannableString(text);
spannableString.setSpan(new ClickableSpan() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Toast.makeText(MainActivity.this, "請稍等1秒鐘進入下一個Activity介面", Toast.LENGTH_LONG).show();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
startActivity(new Intent(MainActivity.this,NewActivity.class));
}
}, 5, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv_intent.setText(spannableString);
//為了響應點選
tv_intent.setMovementMethod(LinkMovementMethod.getInstance());
}
}