先准备两个TextView控件。在本例中我们使用SpannableString对象来设置Span,SpannableString和SpannableStringBuilder的区别是SpannableString不允许修改文本,只允许设置Span,而SpannableStringBuilder即允许修改文本,也允许设置Span。
下面的代码采用了隐式创建ClickableSpan对象实例的方法来设置Span,并在其中覆盖了onClick方法。
package mobile.android.ch05.link.activity; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.text.SpannableString; import android.text.Spanned; import android.text.method.LinkMovementMethod; import android.text.style.ClickableSpan; import android.view.View; import android.widget.TextView; public class Main extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); TextView textView1 = (TextView) findViewById(R.id.textview1); TextView textView2 = (TextView) findViewById(R.id.textview2); String text1 = "显示Activity1"; String text2 = "显示Activity2"; // 将文本转换成SpannableString对象 SpannableString spannableString1 = new SpannableString(text1); SpannableString spannableString2 = new SpannableString(text2); // 将text1中的所有文本设置成ClickableSpan对象,并实现了onClick方法 spannableString1.setSpan(new ClickableSpan() { // 在onClick方法中可以编写单击链接时要执行的动作 @Override public void onClick(View widget) { Intent intent = new Intent(Main.this, Activity1.class); // 显示Activity1 startActivity(intent); } }, 0, text1.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 将text2中的所有文本设置成ClickableSpan对象,并实现了onClick方法 spannableString2.setSpan(new ClickableSpan() { // 在onClick方法中可以编写单击链接时要执行的动作 @Override public void onClick(View widget) { Intent intent = new Intent(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的界面。