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