閱讀445 返回首頁    go 阿裏雲 go 技術社區[雲棲]


API Demos 2.3 學習筆記 (4)-- Text->Linkify

更多精彩內容,請點擊閱讀:《API Demos 2.3 學習筆記》


 Android實現TextView中文本鏈接的方式有很多種。

總結起來大概有4種:

1、通過android:autoLink屬性來實現對TextView中文本相應類型的鏈接進行自動識別。

例如:android:autoLink= all 可以自動識別TextView文本中的網絡地址,郵件地址,電話號碼,地圖位置等,並進行鏈接。

android:autoLink所有支持的鏈接屬性取值如下:

常量

描述

none

0x00

不進行自動識別(默認).

web

0x01

自動識別網絡地址

email

0x02

自動識別郵件地址

phone

0x04

自動識別電話號碼

map

0x08

自動識別地圖位置

all

0x0f

自動識別以上四種鏈接屬性(相當於web|email|phone|map).

注:可以通過“|”符號連接多個屬性值來支持多種類型的鏈接自動識別。例如,

android:autoLink=web|email|phone支持對網絡地址,郵件地址,電話號碼的自動識別,並進行鏈接。
這是在XML文件中進行屬性設置來識別鏈接的方式,還有一種在Java代碼中進行屬性設置的方式,同樣可以實現類似功能。例如TextView對象mTextView1,我們可以通過mTextView1.setAutoLinkMask(intmask)來實現對TextView中文本相應類型的鏈接進行自動識別。其中mask所有取值如下:

常量

int

ALL

自動識別郵件地址,網絡地址,地圖位置和電話號碼

 

int

EMAIL_ADDRESSES

自動識別郵件地址

 

int

MAP_ADDRESSES

自動識別地圖位置

 

int

PHONE_NUMBERS

自動識別電話號碼

 

int

WEB_URLS

自動識別網絡地址

 

注:使用時請在常量前麵加上Linkify.字樣,例如:mTextView1.setAutoLinkMask(Linkify.ALL)

2、將含有HTML鏈接標記的文本寫在Android資源文件中,如string.xml,然後在Java代碼中直接引用。

3、通過Html類的fromHtmlStringsource)方法來對含有HTML鏈接標記的文本進行格式化處理。

4、通過Spannable或繼承它的類,如SpannableString來格式化部分字符串。關於SpannableString的詳細用法,請參考:https://blog.csdn.net/yang_hui1986527/article/details/6776629

注:默認情況下,第234種方法可以顯示鏈接,但是無法響應用戶的點擊輸入。如果需要激活該響應,需要調用TextView對象的以下方法:setMovementMethod(LinkMovementMethod.getInstance())

下麵我們進行實例代碼解析:

 res-value-string.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="link_text_auto"><b>text1:</b> This is some text.  In
      this text are some things that are actionable.  For instance,
      you can click on https://www.google.com and it will launch the
      web browser.  You can click on google.com too.  And, if you
      click on (415) 555-1212 it should dial the phone.
    </string>
    <string name="link_text_manual"><b>text2:</b> This is some other
      text, with a <a href="https://www.google.com">link</a> specified
      via an <a> tag.  Use a \"tel:\" URL
      to <a href="tel:4155551212">dial a phone number</a>.
    </string>
</resources>

res-layout-link.xml

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:andro
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="wrap_content">

  <!-- 四個TextView控件, 每個控件都顯示包含鏈接的文本。 -->

  <!-- text1 自動識別文本鏈接,例如URL網絡地址和電話號碼等。 -->
  <TextView xmlns:andro
            android:
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:autoLink="all"
            android:text="@string/link_text_auto"
            />

  <!-- text2 使用包含用<a>等顯式HTML標記來指定鏈接的文本資源。 -->
  <TextView xmlns:andro
            android:
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:text="@string/link_text_manual"
            />

  <!-- text3 在Java代碼中使用HTML類來構造包含鏈接的文本。 -->
  <TextView xmlns:andro
            android:
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            />

  <!-- text4 在Java代碼中不使用HTML類來構造包含鏈接的文本。  -->
  <TextView xmlns:andro
            android:
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            />

</LinearLayout>

src-com.example.android.apis.text-Link.java

package com.example.android.apis.text;

import com.example.android.apis.R;

import android.app.Activity;
import android.graphics.Typeface;
import android.os.Bundle;
import android.text.Html;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.text.style.StyleSpan;
import android.text.style.URLSpan;
import android.widget.TextView;

public class Link extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
       //super.onCreate(savedInstanceState)是調用父類的onCreate構造函數
    	//savedInstanceState是保存當前Activity的狀態信息
    	super.onCreate(savedInstanceState);

        //將link布局文件渲染出一個View對象,並作為Activity的默認View
        setContentView(R.layout.link);

        // text1 通過 android:autoLink 屬性自動識別文本中的鏈接,例如URL網絡地址和電話號碼等。
         // 不需要任何java代碼來使之起作用。

        // text2 含有由<a>等HTML標記指定的文本鏈接。默認情況下,這些鏈接可以顯示但不會響應用戶輸入。
        //要想這些鏈接響應用戶的點擊輸入,你需要調用TextView的setMovementMethod()方法 。
        
        TextView t2 = (TextView) findViewById(R.id.text2);
        t2.setMovementMethod(LinkMovementMethod.getInstance());

        // text3 顯示在java代碼中通過HTML類來創建包含文本鏈接的文本,而不是從文本資源中創建。
        //請注意,對於一個固定長度文本,最好像上麵的例子一樣,從文本資源中創建。
        // 這個例子僅僅說明您怎樣去顯示來自動態來源(例如,網絡)的文本。

        TextView t3 = (TextView) findViewById(R.id.text3);
        t3.setText(
            Html.fromHtml(
                "<b>text3:</b>  Text with a " +
                "<a href=\"https://www.google.com\">link</a> " +
                "created in the Java source code using HTML."));
        t3.setMovementMethod(LinkMovementMethod.getInstance());

        // text4 舉例說明完全不通過HTML標記來構建一個包含鏈接的格式化文本。
        // 對於固定長度的文本,你最好使用string資源文本(即在string.xml中指定),而不是硬編碼值(即在java代碼中指定)。

        //構建一個SpannableString
        SpannableString ss = new SpannableString(
            "text4: Click here to dial the phone.");

        //設置粗體
        ss.setSpan(new StyleSpan(Typeface.BOLD), 0, 6,
                   Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //設置電話號碼的鏈接
        ss.setSpan(new URLSpan("tel:4155551212"), 13, 17,
                   Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        TextView t4 = (TextView) findViewById(R.id.text4);
        t4.setText(ss);
        t4.setMovementMethod(LinkMovementMethod.getInstance());
    }
}

知識點1:android:表示為相應對象新增一個id名(text1),方便在Java代碼中引用該對象。引用方法為:R.id.id名,如下所示:
TextView t2 = (TextView) findViewById(R.id.text2);


知識點2:android:layout_width和android:layout_height
這兩個是控件的布局屬性,可以取值FILL_PARENT,MATCH_PARENT,
WRAP_CONTENT。其中FILL_PARENT和MATCH_PARENT代表該控件寬/高與parent相同,而WRAP_CONTENT代表該控件寬/高隨著本身的內容而調整。
注:android2.2以前我們使用FILL_PARENT。從android2.2開始,FILL_PARENT被棄用,改用MATCH_PARENT。


知識點3:android:orientation
一般用作LinearLayout線性布局的屬性。android:orientation="vertical" 表示垂直布局 ;android:orientation="horizontal" 表示水平布局 。


效果預覽:


最後更新:2017-04-02 06:51:56

  上一篇:go API Demos 2.3 學習筆記 (5)-- Text-&gt;LogTextBox
  下一篇:go 對AttributeSet和defStyle的理解