国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Android - Android中Textview超鏈接實現(xiàn)方式

Android中Textview超鏈接實現(xiàn)方式

2021-05-26 15:11mxn Android

TextView中的超鏈接可以通過幾種方式實現(xiàn):1.Html.fromHtml,2.Spannable,3.Linkify.addLinks。下面分別進(jìn)行測試,包括修改字體樣式,下劃線樣式,點擊事件等,需要的朋友可以參考下

TextView中的超鏈接可以通過幾種方式實現(xiàn):
一、Html.fromHtml方式

TextView,本身就支持部分的Html格式標(biāo)簽。這其中包括常用的字體大小顏色設(shè)置,文本鏈接等。使用起來也比較方便,只需要使用Html類轉(zhuǎn)換一下即可: textView.setText(Html.fromHtml(str));

代碼如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
public class Test10Activity extends Activity {
 TextView textView ;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_test10);
  textView = (TextView) findViewById(R.id.text);
  String webLinkText = "<a href='https://souly.cn'> html超鏈接測試</a>" ;
  textView.setText(Html.fromHtml(webLinkText));
 }
}

這時候點擊超鏈接并沒有跳轉(zhuǎn)效果,需要加上

textView.setMovementMethod(LinkMovementMethod.getInstance());
之后才會跳轉(zhuǎn)。 這樣點擊之后會用默認(rèn)瀏覽器打開url。

現(xiàn)在字體顏色和下劃線是默認(rèn)樣式,修改字體顏色比較簡單,可以直接用標(biāo)簽:

?
1
2
3
4
String webLinkText =
  "<font color='#333333'><a href='https://souly.cn' style='text-decoration:none; color:#0000FF'>
  html超鏈接測試</a>" ;

但是想不借助其他類去掉下劃線就沒有辦法了。

還有一種更簡單的方法就是在TextView的xml布局中加入autoLink自動識別,這樣做操作最簡單,但是也不能修改樣式:

?
1
2
3
4
5
6
7
8
<TextView
   android:id="@+id/text"
   android:layout_width="wrap_content"
   android:layout_height="wrap_content"
   android:textSize="20sp"
   android:text="souly.cn"
   android:autoLink="email|phone|web"
   /> 

二、Spannable方式

在xml中設(shè)置了android:autoLink="email|phone|web"后,url文字下面會有一條下劃線,我們可以看URLSpan所繼承的類ClickableSpan 類的源碼,如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public abstract class ClickableSpan extends CharacterStyle implements UpdateAppearance {
 
   /
   * Performs the click action associated with this span.
   */
 
   public abstract void onClick(View widget);
 
   /
   * Makes the text underlined and in the link color.
   */
 
   @Override
 
   public void updateDrawState(TextPaint ds) {
 
    ds.setColor(ds.linkColor);
 
    ds.setUnderlineText(true);
 
   }
 
  }

它調(diào)用ds.setUnderlineText(true); 設(shè)置了下劃線。我們再設(shè)置一個沒有下劃線的Spannable對象就可以了。 我們重寫一個類繼承UnderlineSpan,和ClickableSpan一樣,都是CharacterStyle的子類。

使用方法如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Test10Activity extends Activity {
 TextView textView ;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_test10);
  textView = (TextView) findViewById(R.id.text);
  String webLinkText = "我的博客-->https://souly.cn" ;
  textView.setText(webLinkText);
  NoUnderlineSpan mNoUnderlineSpan = new NoUnderlineSpan();
  if (textView.getText() instanceof Spannable) {
   Spannable s = (Spannable) textView.getText();
   s.setSpan(mNoUnderlineSpan, 0, s.length(), Spanned.SPAN_MARK_MARK);
  }
 }
 public static class NoUnderlineSpan extends UnderlineSpan {
  public NoUnderlineSpan() {}
  public NoUnderlineSpan(Parcel src) {}
  @Override
  public void updateDrawState(TextPaint ds) {
   super.updateDrawState(ds);
   ds.setUnderlineText(false);
  }
 }
}

這樣textview在界面上就不會有下劃線了,但卻保留著autolink的功能。 這個超鏈接是默認(rèn)顏色,如果需要改變顏色可以在xml中設(shè)置android:textColorLink="#1e84fb", 或者在java代碼中設(shè)置tv.setLinkTextColor(color);

上面的例子是在autoLink設(shè)置的情況下自動識別超鏈接的,如果不需要自動識別,而是自己手動設(shè)置需要跳轉(zhuǎn)的網(wǎng)址, 可以使用以下方法,首先刪除xml中的android:autoLink="email|phone|web"

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class Test10Activity extends Activity {
 TextView textView ;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_test10);
  textView = (TextView) findViewById(R.id.text);
  String webLinkText = "我的博客" ;
  SpannableString text = new SpannableString(webLinkText);
  NoUnderlineSpan mNoUnderlineSpan = new NoUnderlineSpan("https://souly.cn") ;
  text.setSpan(mNoUnderlineSpan,0,text.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
  textView.setText(text);
  textView.setMovementMethod(LinkMovementMethod.getInstance());
 }
 public static class NoUnderlineSpan extends URLSpan {
  public NoUnderlineSpan(String url) {
   super(url);
  }
  @Override
  public void updateDrawState(TextPaint ds) {
   super.updateDrawState(ds);
   ds.setUnderlineText(false);
  }
 }
}

這里的NoUnderlineSpan繼承了URLSpan而不是UnderlineSpan,URLSpan是ClickableSpan的子類。

有的時候我們需要自定義超鏈接點擊事件,例如彈一個Toast,那么重寫ClickableSpan:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public class Test10Activity extends Activity {
 TextView textView;
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_test10);
  textView = (TextView) findViewById(R.id.text);
  String webLinkText = "我的博客";
  SpannableString spStr = new SpannableString(webLinkText);
  ClickableSpan clickSpan = new NoLineClickSpan(spStr.toString()); //設(shè)置超鏈接
  spStr.setSpan(clickSpan, 0, spStr.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
  textView.append(spStr);
  textView.setMovementMethod(LinkMovementMethod.getInstance());
 }
 private class NoLineClickSpan extends ClickableSpan {
  String text;
  public NoLineClickSpan(String text) {
   super();
   this.text = text;
  }
  @Override
  public void updateDrawState(TextPaint ds) {
   ds.setColor(ds.linkColor);
   ds.setUnderlineText(false); //去掉下劃線
  }
  @Override
  public void onClick(View widget) {
   processHyperLinkClick(text); //點擊超鏈接時調(diào)用
  }
 }
 private void processHyperLinkClick(String text){
  Toast.makeText(this,text,Toast.LENGTH_SHORT).show();
 }
}

三、Linkify.addLinks方式

除了使用默認(rèn)的web等模式之外,我們還可以通過Linkify類的addLinks方法來添加自定義模式。Linkify.addLinks也是功能最 強大的一種方式。

在講這種方式之前先科普一下Intent Filters的知識。

android中的activity,service,Broadcast Receivers都可以設(shè)置intent過濾器,它們可以有一個或多個intent過濾器。 每個過濾器描述組件的一種能力,即告知系統(tǒng)能夠處理哪些隱式intent。個顯式intent總是能夠傳遞到它的目標(biāo)組件,不管它包含什么; 不考慮過濾器。但是一個隱式intent,僅當(dāng)它能夠通過組件的過濾器之一才能夠傳遞給它。

一個intent過濾器是一個IntentFilter類的實例。因為Android系統(tǒng)在啟動一個組件之前必須知道它的能力,但是intent過濾器通常不在java 代碼中設(shè)置,而是在應(yīng)用程序的清單文件(AndroidManifest.xml)中以元素設(shè)置。但有一個例外, 廣播接收者的過濾器通過調(diào)用Context.registerReceiver()動態(tài)地注冊,它直接創(chuàng)建一個IntentFilter對象。

一個過濾器有對應(yīng)于Intent對象的動作、數(shù)據(jù)、種類的字段。過濾器要檢測隱式intent的所有這三個字段,其中任何一個失敗, Android系統(tǒng)都不會傳遞intent給組件。然而,因為一個組件可以有多個intent過濾器,一個intent通不過組件的過濾器檢測, 其它的過濾器可能通過檢測。

*動作檢測

清單文件中的元素以子元素列出動作,例如:

?
1
2
3
4
5
6
<intent-filter>
 <action android:name="com.example.project.SHOW_CURRENT" />
 <action android:name="com.example.project.SHOW_RECENT" />
 <action android:name="com.example.project.SHOW_PENDING" />
 . . .
</intent-filter>

像例子所展示,雖然一個Intent對象僅是單個動作,但是一個過濾器可以列出不止一個。這個列表不能夠為空,一個過濾器必須至少包含一個 子元素,否則它將阻塞所有的intents。

要通過檢測,Intent對象中指定的動作必須匹配過濾器的動作列表中的一個。如果對象或過濾器沒有指定一個動作,結(jié)果將如下:

如果過濾器沒有指定動作,沒有一個Intent將匹配,所有的intent將檢測失敗,即沒有intent能夠通過過濾器。 如果Intent對象沒有指定動作,將自動通過檢查(只要過濾器至少有一個子元素,否則就是上面的情況了)

*種類檢測

類似的,清單文件中的元素以子元素列出種類,例如:

?
1
2
3
4
5
<intent-filter>
 <category android:name="android.intent.category.DEFAULT" />
 <category android:name="android.intent.category.BROWSABLE" />
 . . .
</intent-filter>

對于一個intent要通過種類檢測,intent對象中的每個種類必須匹配過濾器中的一個。即過濾器能夠列出額外的種類,但是intent對象中的種類都必須能夠在過濾器中找到, 只要一個種類在過濾器列表中沒有,就算種類檢測失敗!

因此,原則上如果一個intent對象中沒有種類(即種類字段為空)應(yīng)該總是通過種類測試,而不管過濾器中有什么種類。但是有個例外, Android對待所有傳遞給Context.startActivity()的隱式intent好像它們至少包含"android.intent.category.DEFAULT" (對應(yīng)CATEGORY_DEFAULT常量)。因此,activity想要接收隱式intent必須要在intent過濾器中包含"android.intent.category.DEFAULT"。

注意:"android.intent.action.MAIN" 和 "android.intent.category.LAUNCHER"設(shè)置,它們分別標(biāo)記活動開始新的任務(wù)和帶到啟動列表界面。 它們可以包含"android.intent.category.DEFAULT"到種類列表,也可以不包含。

*數(shù)據(jù)檢測

類似的,清單文件中的元素以子元素列出數(shù)據(jù),例如:

?
1
2
3
4
5
<intent-filter>
  <data android:mimeType="video/mpeg" android:scheme="http" />
  <data android:mimeType="audio/mpeg" android:scheme="http" />
  . . .
</intent-filter>

每個元素指定一個URI和數(shù)據(jù)類型(MIME類型)。它有幾個屬性scheme、host、port、path、query、fragment對應(yīng)于URI的每個部分: scheme://host:port/path?query#fragment或者scheme://userInfo@host:port/path?query#fragment。

scheme是content,host是"com.example.project",port是200,path是"folder/subfolder/etc"。host和port一起構(gòu)成URI的憑據(jù) (authority),如果host沒有指定,port也被忽略。 這幾個屬性都是可選的,但它們之間并不都是完全獨立的。要讓authority有意義, scheme必須也要指定。要讓path有意義,scheme和authority也都必須要指定。

當(dāng)比較intent對象和過濾器的URI時,僅僅比較過濾器中出現(xiàn)的URI屬性。例如,如果一個過濾器僅指定了scheme,所有有此scheme的URIs都匹配過濾器; 如果一個過濾器指定了scheme和authority,但沒有指定path,所有匹配scheme和authority的URIs都通過檢測,而不管它們的path; 如果幾個屬性都指定了,要都匹配才能算是匹配。然而,過濾器中的path可以包含通配符來要求匹配path中的一部分。

元素的type屬性指定數(shù)據(jù)的MIME類型。Intent對象和過濾器都可以用""通配符匹配子類型字段,例如"text/","audio/*"表示任何子類型。

數(shù)據(jù)檢測既要檢測URI,也要檢測數(shù)據(jù)類型。規(guī)則如下:

1.一個Intent對象既不包含URI,也不包含數(shù)據(jù)類型:僅當(dāng)過濾器也不指定任何URIs和數(shù)據(jù)類型時,才不能通過檢測;否則都能通過。 2.一個Intent對象包含URI,但不包含數(shù)據(jù)類型:僅當(dāng)過濾器也不指定數(shù)據(jù)類型,同時它們的URI匹配,才能通過檢測。例如,mailto:和tel:都不指定實際數(shù)據(jù)。 3.一個Intent對象包含數(shù)據(jù)類型,但不包含URI:僅當(dāng)過濾也只包含數(shù)據(jù)類型且與Intent相同,才通過檢測。 4.一個Intent對象既包含URI,也包含數(shù)據(jù)類型(或數(shù)據(jù)類型能夠從URI推斷出):數(shù)據(jù)類型部分,只有與過濾器中之一匹配才算通過;URI部分,它的URI要出現(xiàn)在過濾器中,或者它有content :或file: URI,又或者過濾器沒有指定URI。換句話說,如果它的過濾器僅列出了數(shù)據(jù)類型,組件假定支持content:和file: 。 如果一個Intent能夠通過不止一個活動或服務(wù)的過濾器,用戶可能會被問那個組件被激活。如果沒有目標(biāo)找到,會產(chǎn)生一個異常。

下面寫一個例子來通過定義Scheme接收特定URI開啟Activity

首先在AndroidManifast.xml要給被指定Scheme的Activity下設(shè)置如下參數(shù)

?
1
2
3
4
5
6
7
8
<intent-filter>
 
    <category android:name="android.intent.category.DEFAULT"></category>
 
    <action android:name="android.intent.action.VIEW"></action>
 
    <data android:host="profile" android:scheme="mxn"/>
</intent-filter>

這樣即指定了接收Uri的Scheme為“mxn”,host為“profile” 且 Action為View的Intent。 可以利用如下Intent調(diào)用Activity: startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("mxn://profile?uid=1"))); 傳遞一個參數(shù)uid=1.

在設(shè)置了filter的activity中接受參數(shù):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Test9Activity extends Activity {
  private String uid;
  private static final Uri PROFILE_URI = Uri.parse("mxn://profile");
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test8);
    extractUidFromUri();
  }
  private void extractUidFromUri() {
    Uri uri = getIntent().getData();
    if (uri != null && PROFILE_URI.getScheme().equals(uri.getScheme())) {
      uid = uri.getQueryParameter("uid");
      Log.d("=====", "uid from url: " + uid);
    }
  }
}

下面借助Linkify實現(xiàn)超鏈接,實現(xiàn)微博中@的超鏈接功能,布局文件如下

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<RelativeLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     android:gravity="center"
     >
 
       <TextView
         android:id="@+id/text"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:textSize="20sp"
         android:text="【谷歌母公司Alphabet市值超蘋果:全球第一】據(jù)外媒報道,@谷歌 母公司 @Alphabet
         通過公司分拆以及搜索廣告業(yè)務(wù)的持續(xù)強勢,股價繼續(xù)攀升。美國時間周一,Alphabet的公司市值已超過了 @蘋果 ,
         成為全世界市值最大的公司. www.google.com"
         />
   </RelativeLayout>

當(dāng)需要使自定義模式和內(nèi)置模式web,phone等一起被識別時,一定要先聲明內(nèi)置模式,然后再聲明自定義模式,而且不能在xml中通過autoLink屬性聲明, 否則自定義模式不起作用。因為在設(shè)置內(nèi)置模式時,會先刪除已有模式。 下面使用正則匹配帶“@”的用戶名,然后作為uid傳遞到下一個頁面:

?
1
2
3
4
5
6
7
8
9
10
11
public class Test10Activity extends Activity {
  TextView textView ;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test10);
    textView = (TextView) findViewById(R.id.text);
    Pattern p = Pattern.compile("@(\w+?)(?=\W|$)(.)");
    Linkify.addLinks(textView, p, "mxn://profile?uid=");
  }
}

接收的時候跟上面一樣:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class Test9Activity extends Activity {
  private String uid;
  private static final Uri PROFILE_URI = Uri.parse("mxn://profile");
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test8);
    extractUidFromUri();
  }
  private void extractUidFromUri() {
    Uri uri = getIntent().getData();
    if (uri != null && PROFILE_URI.getScheme().equals(uri.getScheme())) {
      uid = uri.getQueryParameter("uid");
      Log.d("=====", "uid from url: " + uid);
    }
  }
}

效果如下:

其實在上面的圖上可以看到,www.google.com并沒有被識別為鏈接(因為我們沒有設(shè)置web模式)。需要注意的是,當(dāng)需要使自定義 模式和內(nèi)置模式web,phone等一起被識別時,一定要先聲明內(nèi)置模式,然后再聲明自定義模式,而且不能在xml中通過autoLink屬性聲明, 否則自定義模式不起作用。因為在設(shè)置內(nèi)置模式時,會先刪除已有模式。

將上面的Java代碼改為:

?
1
2
3
4
5
6
7
8
9
10
11
12
public class Test10Activity extends Activity {
  TextView textView ;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test10);
    textView = (TextView) findViewById(R.id.text);
    Pattern p = Pattern.compile("@(\w+?)(?=\W|$)(.)");
    Linkify.addLinks(textView, Linkify.WEB_URLS);
    Linkify.addLinks(textView, p, "mxn://profile?uid=");
  }
}

現(xiàn)在就可以同時識別web以及自定義模式了。

同樣的,這個超鏈接是默認(rèn)顏色,如果需要改變顏色可以在xml中設(shè)置android:textColorLink="#1e84fb",或者在java代碼中 設(shè)置tv.setLinkTextColor(color);

這時超鏈接還是帶下劃線的,如果想去掉,還是使用上面的思路,重寫URLSpan,

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class Test10Activity extends Activity {
  TextView textView ;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test10);
    textView = (TextView) findViewById(R.id.text);
    Pattern mentionsPattern = Pattern.compile("@(\w+?)(?=\W|$)(.)");
    String mentionsScheme = String.format("%s/?%s=", "mxn://profile", "uid");
    Linkify.addLinks(textView, Linkify.WEB_URLS);
    Linkify.addLinks(textView, mentionsPattern, mentionsScheme) ;
    stripUnderlines(textView) ;
  }
  private class URLSpanNoUnderline extends URLSpan {
    public URLSpanNoUnderline(String url) {
      super(url);
    }
    @Override public void updateDrawState(TextPaint ds) {
      super.updateDrawState(ds);
      ds.setUnderlineText(false);
    }
  }
  private void stripUnderlines(TextView textView) {
    Spannable s = (Spannable)textView.getText();
    URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class);
    for (URLSpan span: spans) {
      int start = s.getSpanStart(span);
      int end = s.getSpanEnd(span);
      s.removeSpan(span);
      span = new URLSpanNoUnderline(span.getURL());
      s.setSpan(span, start, end, 0);
    }
    textView.setText(s);
  }
}

Linkify還支持TranformFilter和MatchFilter接口。它們提供一些對目標(biāo)URI的額外控制和定義匹配字符串,它們的使用如下的框架代碼所示: Linkify.addLinks(myTextView, pattern, prefixWith, new MyMatchFilter(), new MyTransformFilter());

使用Match Filter

在你定義的MatchFilter中實現(xiàn)acceptMatch方法,來為RegEx樣式匹配添加額外的條件。當(dāng)一個潛在的匹配發(fā)現(xiàn)時,acceptMatch被觸發(fā), 匹配的開始點和結(jié)束點(包括被查找的整個文本)以參數(shù)的形式傳入。接下來的代碼顯示了一個MatchFilter的實現(xiàn),它取消任何之前已“.”結(jié)尾的匹配。

?
1
2
3
4
5
class MyMatchFilter implements MatchFilter {
     public boolean acceptMatch(CharSequence s, int start, int end) {
      return s.charAt(end-1) != '.';
     }
  }

使用Transform Filter

Transform Filter為格式化文本字符串提供了更大的自由度,允許你修改由鏈接文本自動生成的隱式URI。 減少鏈接文本和目標(biāo)URI的耦合能更加自由地決定如何顯示數(shù)據(jù)字符串給用戶。

使用Transform Filter,在你定義的TransformFilter中實現(xiàn)transformUrl方法。當(dāng)Linkify找到正確的匹配后,它會調(diào)用transformUrl, 傳入使用的RegEx樣式和它創(chuàng)建的默認(rèn)URI字符串。你可以修改匹配的字符串,然后返回一個適合給其它Android應(yīng)用程序的URI。 利用Transform Filter的修改功能可以實現(xiàn)點擊用戶名,傳遞的是用戶id的功能,在transformUrl中返回你需要傳遞的內(nèi)容

下面的TransformFilter實現(xiàn)將匹配的文本轉(zhuǎn)換成小寫的URI:

?
1
2
3
4
5
class MyTransformFilter implements TransformFilter {
    public String transformUrl(Matcher match, String url) {
      return url.toLowerCase();
  }
}

現(xiàn)在我們加上Match Filter和Transform Filter,上面的代碼可以修改成如下的樣子:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class Test10Activity extends Activity {
  TextView textView ;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_test10);
    textView = (TextView) findViewById(R.id.text);
    Pattern mentionsPattern = Pattern.compile("@(\w+?)(?=\W|$)(.)");
    String mentionsScheme = String.format("%s/?%s=", "mxn://profile", "uid");
    Linkify.addLinks(textView, Linkify.WEB_URLS);
//    Linkify.addLinks(textView, mentionsPattern, mentionsScheme) ;
    Linkify.addLinks(textView, mentionsPattern, mentionsScheme, new Linkify.MatchFilter() {
      @Override
      public boolean acceptMatch(CharSequence s, int start, int end) {
        return s.charAt(end-1) != '.';
      }
    }, new Linkify.TransformFilter() {
      @Override
      public String transformUrl(Matcher match, String url) {
        return url.toLowerCase();
      }
    });
    stripUnderlines(textView) ;
  }
  private class URLSpanNoUnderline extends URLSpan {
    public URLSpanNoUnderline(String url) {
      super(url);
    }
    @Override public void updateDrawState(TextPaint ds) {
      super.updateDrawState(ds);
      ds.setUnderlineText(false);
    }
  }
  private void stripUnderlines(TextView textView) {
    Spannable s = (Spannable)textView.getText();
    URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class);
    for (URLSpan span: spans) {
      int start = s.getSpanStart(span);
      int end = s.getSpanEnd(span);
      s.removeSpan(span);
      span = new URLSpanNoUnderline(span.getURL());
      s.setSpan(span, start, end, 0);
    }
    textView.setText(s);
  }
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲高清色综合 | 国产黄色av网站 | 日韩精品中文字幕在线 | 日韩成人在线播放 | 欧美日韩国产一区二区三区 | 亚洲综合视频 | 黄色av网站免费看 | 伊人99综合| 色免费视频 | 亚洲在线一区二区 | 中文日韩在线 | 午夜影院免费 | 中文字幕视频一区 | 伊人网在线视频免费观看 | 精品久久国产老人久久综合 | 另类久久| av网站入口 | 国产一级毛片国语一级 | 欧美aaa级 | 羞羞网站免费观看 | 亚洲男人的天堂网站 | 天堂俺去俺来也www久久婷婷 | 日韩高清电影 | 亚洲精品久久 | 在线观看一区二区精品 | 国产欧美一区二区精品性色 | 一二区视频 | 亚洲欧洲久久 | 久久精品国产99国产精品 | 国产女人爽到高潮免费视频 | 日韩成人一区 | 久久精品国产精品青草 | 亚洲国产精品久久 | 伊人五月 | 久久草在线视频 | 在线播放中文字幕 | 国产精品毛片久久久久久久av | 欧洲亚洲精品久久久久 | 91视频专区 | 久久1区| 日韩午夜av |