1. 程式人生 > >android的TextView中顯示url

android的TextView中顯示url

一、在Layout檔案中設定TextView的屬性

  1. android:autoLink="email|phone|web"
這樣Android就會自動識別郵件、電話號碼、網址了,點選時會出發不同的Intent進行處理。
二、使用Linkify

Linkify是一個輔助類,通過RegEx樣式匹配,自動地在TextView類(和繼承的類)中建立超連結。

符合特定的RegEx樣式的文字會被轉變成可點選的超連結,這些超連結隱式地呼叫startActivity(new Intent(Intent.ACTION_VIEW, uri)),符合的文字會作為目標URI

你可以指定任意的字串樣式為連結;方便地,

Linkify類提供了預置的通用內容型別(如電話號碼和e-mailweb地址)。

本地的連結型別

Linkify.addLinks靜態方法接受一個View來製作連結,還包括一個或多個支援的預設內容型別的位結果。Linkify類提供了一些內容型別:WEB_URLS、EMAIL_ADDRESSES、PHONE_NUMBERS和ALL.

接下來的程式碼片段顯示如何為TextView製作連結顯示webe-mail地址為超連結。當點選時,它們會相應地開啟瀏覽器或e-mail應用程式。

  1. TextView textView = (TextView)findViewById(R.id.myTextView);  
  2. Linkify.addLinks(textView, Linkify.WEB_URLS|Linkify.EMAIL_ADDRESSES);  

你可以在layout資源裡使用android:autoLink特性來為View製作連結。它支援一個或多個(用|分割)自定義的值:nonewebemailphoneall。接下來的XML片段顯示瞭如何為電話號碼和e-mail地址新增超連結:

  1. <TextView  
  2. android:layout_width=”fill_parent”  
  3. android:layout_height=”fill_parent”  
  4. android:text=”@string
    /linkify_me”  
  5. android:autoLink=”phone|email”  
  6. />  

建立自定義的連結字串

為了定義自己的連結字串,你需要建立一個RegEx樣式來匹配文字,進而顯示成超連結。

和本地型別一樣,通過呼叫Linkify.addLinks來指定目標View,但這次,傳入的是新的RegEx樣式。你還可以傳入一個字首,當連結點選時,它會新增到目標URI上。

接下來的例子顯示了一個View連結到由Android Content Provider(下一章你會建立)提供的地震資料。與包含所有的情況相比,連結樣式能匹配任何以“quake”開頭後跟一個數字的文字。在Intent被觸發前,內容會被新增到URI上。

  1. int flags = Pattern.CASE_INSENSITIVE;  
  2. Pattern p = Pattern.compile(“\\bquake[0-9]*\\b”, flags);  
  3. Linkify.addLinks(myTextView, p, “content://com.paad.earthquake/earthquakes/”);

Linkify還支援TranformFilterMatchFilter介面。它們提供一些對目標URI的額外控制和定義匹配字串,它們的使用如下的框架程式碼所示:

  1. Linkify.addLinks(myTextView, pattern, prefixWith, new MyMatchFilter(), new MyTransformFilter());  

使用Match Filter

在你定義的MatchFilter中實現acceptMatch方法,來為RegEx樣式匹配新增額外的條件。當一個潛在的匹配發現時,acceptMatch被觸發,匹配的開始點和結束點(包括被查詢的整個文字)以引數的形式傳入。

接下來的程式碼顯示了一個MatchFilter的實現,它取消任何之前是一個“!”的匹配。

  1. class MyMatchFilter implements MatchFilter {  
  2. <span style="white-space:pre">  </span>publicboolean acceptMatch(CharSequence s, int start, int end) {  
  3. <span style="white-space:pre">  </span>return (start == 0 || s.charAt(start-1) != ‘!’);  
  4. <span style="white-space:pre">  </span>}  
  5. }  

使用Transform Filter

Transform Filter為格式化文字字串提供了更大的自由度,允許你修改由連結文字自動生成的隱式URI。減少連結文字和目標URI的耦合能更加自由地決定如何顯示資料字串給使用者。

使用Transform Filter,在你定義的TransformFilter中實現transformUrl方法。當Linkify找到正確的匹配後,它會呼叫transformUrl,傳入使用的RegEx樣式和它建立的預設URI字串。你可以修改匹配的字串,然後返回一個適合給其它Android應用程式“看”的URI

下面的TransformFilter實現將匹配的文字轉換成小寫的URI

  1. class MyTransformFilter implements TransformFilter {  
  2. <span style="white-space:pre">  </span>public String transformUrl(Matcher match, String url) {  
  3. <span style="white-space:pre">  </span>return url.toLowerCase();  
  4. <span style="white-space:pre">  </span>}  
  5. }