TextView url 识别,Spannable 使用 电话 网址 邮件

首先看一个链接文本执行流程的大概示意图





看了这个流程应该对大概URL, Email等的链接实现有所了解了,所以直接看代码把


Java代码
  1. TextViewview1=(TextView)findViewById(R.id.view1);
  2. TextViewview2=(TextView)findViewById(R.id.view2);
  3. TextViewview3=(TextView)findViewById(R.id.view3);
  4. TextViewview4=(TextView)findViewById(R.id.view4);
  5. TextViewview5=(TextView)findViewById(R.id.view5);
  6. TextViewview6=(TextView)findViewById(R.id.view6);
  7. SpannableStringtext1=newSpannableString("red");
  8. text1.setSpan(newForegroundColorSpan(Color.RED),0,3,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
  9. view1.setText(text1);
  10. SpannableStringtext2=newSpannableString("green");
  11. text2.setSpan(newBackgroundColorSpan(Color.GREEN),0,5,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
  12. view2.setText(text2);
  13. SpannableStringtext3=newSpannableString("iambold");
  14. text3.setSpan(newStyleSpan(Typeface.BOLD_ITALIC),5,9,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
  15. view3.setText(text3);
  16. SpannableStringtext4=newSpannableString("underline");
  17. text4.setSpan(newUnderlineSpan(),0,9,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
  18. view4.setText(text4);
  19. SpannableStringtext5=newSpannableString("deleteline");
  20. text5.setSpan(newStrikethroughSpan(),7,11,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
  21. view5.setText(text5);
  22. SpannableStringtext6=newSpannableString("makeacall");
  23. text6.setSpan(newURLSpan("tel:123456789"),7,11,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
  24. view6.setText(text6);
  25. view6.setMovementMethod(LinkMovementMethod.getInstance());
  26. //还有ImageSpan等






XML布局文件

Java代码
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayout
  3. xmlns:android="http://schem<wbr>as.android.c<wbr>om/apk/res/a<wbr>ndroid</wbr></wbr></wbr>"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. android:orientation="vertical"
  7. >
  8. <TextView
  9. android:id="@+id/view1"
  10. android:layout_width="wrap_content"
  11. android:layout_height="50sp"
  12. android:gravity="center"
  13. />
  14. <TextView
  15. android:id="@+id/view2"
  16. android:layout_width="wrap_content"
  17. android:layout_height="50sp"
  18. android:gravity="center"
  19. />
  20. <TextView
  21. android:id="@+id/view3"
  22. android:layout_width="wrap_content"
  23. android:layout_height="50sp"
  24. android:gravity="center"
  25. />
  26. <TextView
  27. android:id="@+id/view4"
  28. android:layout_width="wrap_content"
  29. android:layout_height="50sp"
  30. android:gravity="center"
  31. />
  32. <TextView
  33. android:id="@+id/view5"
  34. android:layout_width="wrap_content"
  35. android:layout_height="50sp"
  36. android:gravity="center"
  37. />
  38. <TextView
  39. android:id="@+id/view6"
  40. android:layout_width="wrap_content"
  41. android:layout_height="50sp"
  42. android:gravity="center"
  43. />
  44. </LinearLayout>



默认的链接在点击时,只会跳转到响应的View,如点击URL时,打开浏览器,点击电话号码时,打开拨号界面。 如果我们要在点击某连接时,跳转到某个Activity呢。

URLSpan继承自ClickableSpan,所以我们的出发点也是这个类,然后重写其中的onClick


Java代码
  1. publicclassIntentSpanextendsClickableSpanimplementsParcelableSpan{
  2. privateIntentmIntent;
  3. publicIntentSpan(IntenttoActivity){
  4. mIntent=toActivity;
  5. }
  6. @Override
  7. publicvoidonClick(ViewsourceView){
  8. Contextcontext=sourceView.getContext();
  9. context.startActivity(mIntent);
  10. }
  11. @Override
  12. publicintgetSpanTypeId(){
  13. return100;
  14. }
  15. @Override
  16. publicintdescribeContents(){
  17. return0;
  18. }
  19. @Override
  20. publicvoidwriteToParcel(Parceldest,intflag){
  21. //don'twritetoparcel
  22. }
  23. publicIntentgetIntent(){
  24. returnmIntent;
  25. }
  26. }



使用的话和URLSpan差不多


Java代码
  1. SpannableStringtext6=newSpannableString("makeacall");
  2. Intentintent=newIntent(context,SomActivity.class);
  3. text6.setSpan(newIntentSpan(intent),7,11,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
  4. view6.setText(text6);
  5. view6.setMovementMethod(LinkMovementMethod.getInstance());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值