API Demos 2.3 學習筆記 (4)-- Text->Linkify
更多精彩內容,請點擊閱讀:《API Demos 2.3 學習筆記》
Android實現TextView中文本鏈接的方式有很多種。
總結起來大概有4種:
1、通過android:autoLink屬性來實現對TextView中文本相應類型的鏈接進行自動識別。
例如:android:autoLink= all 可以自動識別TextView文本中的網絡地址,郵件地址,電話號碼,地圖位置等,並進行鏈接。
android:autoLink所有支持的鏈接屬性取值如下:
|
常量 |
值 |
描述 |
|---|---|---|
|
|
0x00 |
不進行自動識別(默認). |
|
|
0x01 |
自動識別網絡地址 |
|
|
0x02 |
自動識別郵件地址 |
|
|
0x04 |
自動識別電話號碼 |
|
|
0x08 |
自動識別地圖位置 |
|
|
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類的fromHtml(Stringsource)方法來對含有HTML鏈接標記的文本進行格式化處理。
4、通過Spannable或繼承它的類,如SpannableString來格式化部分字符串。關於SpannableString的詳細用法,請參考:https://blog.csdn.net/yang_hui1986527/article/details/6776629
注:默認情況下,第2,3,4種方法可以顯示鏈接,但是無法響應用戶的點擊輸入。如果需要激活該響應,需要調用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