在Android實作HTML TextView與AutoLink使用的建議方式


AndroidTextView除了可以用來顯示文字資料之外,還可以使用HTML語法來調整文字的樣式和文字超連結,無需特地去使用WebView。只是一旦使用TextView製作超連結,該TextView就會變得難以控制,因此有幾個特性應該是設計師必須事先知道的。

TextView顯示HTML

要使用TextView顯示HTML的作法很簡單,只要用以下方式來setText即可。

例如:

結果如下:

在Android實作HTML TextView與AutoLink使用的建議方式

啟用HTML超連結

如果只是單單使用TextView的setText方法來指定HTML語法,HTML超連結將無法有真正的作用,可以使用Android SDK內建提供的方式來讓TextView擁有超連結的功能,程式只要添加一行即可,如下:

指定LinkMovementMethodtextView,使其擁有超連結的功能。

TextView使用AutoLink自動判斷連結

若資料來源並非是HTML,而是純文字的話,如果想要讓文字中的網址、電子郵件等等的資訊也擁有超連結,可以設定TextViewAutoLink屬性,決定要將哪些資訊自動產生超連結。

XML檔案中設定autolink屬性

添加方式如下:

若將android:autoLink設為all,那它會將text文字中的網址、電子郵件、地址、電話都變成超連結。如果沒有特殊需求的話,不要自動將電話變成超連結,因為不是所有的Android裝置都能夠打電話,且電話格式各國都不太一樣,很大的機率會將一般數字誤判成電話。也不要自動將地址變成超連結,因為並非在所有裝置上都有地圖App,而且Android好像沒辦法判斷中文地址。所以autoLink屬性可以改寫如下:

如果在XML設定autoLink,啟用了AutoLink屬性的話,LinkMovementMethod將會被自動加入TextView中,因此沒有必要使用setMovementMethod再指定LinkMovementMethod

SDK中用Java程式指定AutoLinkMask

添加方式如下:

不將電話和地址加上超連結的寫法如下:

僅用setAutoLinkMask方法是無法啟用AutoLink屬性的,還再指定LinkMovementMethod給TextView:

不必使用HTML的a標籤指定超連結

啟用textView的AutoLink之後,就不必再使用HTML的a標籤來製作超連結。因為Android會自動抓取text文字中符合的格式,將其自動更換為HTML的超連結。當然如果想要讓超連結顯示出不同的文字,還是可以使用a標籤來指定。完全不使用HTML,Android也會自動產生超連結。

以下舉個例子:

結果如下:

在Android實作HTML TextView與AutoLink使用的建議方式

支援超連結的TextView所產生的問題

要讓TextView擁有超連結功能,必須要指定LinkMovementMethodTextView。然而TextView一旦設定了MovementMethod或是KeyListener,TextView會自動將Focusable、Clickable、LongClickable屬性設定為true。

問題與解決方法

當TextView為Focusable的時候,且此TextView作為GridView或是ListView的Item,會使得無論是否點擊到TextView,onItemClickListener和onItemLongClickListener都會沒有作用。所以一定要覆寫掉hasFocusable方法,讓他永遠傳回false。

當TextView為Clickable的時候,onTouchEvent將永遠回傳true,所以點擊事件在TextView中就被擋下了,無法傳給更上層的View,因此當此TextView作為GridView或是ListView的Item時,onItemClickListener和onItemLongClickListener將無作用,所以一定要想辦法覆寫掉onTouchEvent方法,讓它可以在點擊到TextView中連結的時候傳回true就好。

但是,Android內建的LinkMovementMethod並不會讓我們知道使用者到底是不是點擊連結,因此我們還必須改寫LinkMovementMethod。

改寫後的TextView命名為LinkTextView,LinkMovementMethod命名為LinkTextViewMovementMethod,程式碼如下:

LinkTextView的使用方式和一般的TextView一樣,只不過如果要使其支援超連結功能,一定要手動指定LinkTextViewMovementMethod給LinkTextView,如下:

關於作者

Magic Len

各位好,我是Magic Len,是這網站的管理員。我是台灣台中大肚山上人,畢業於台中高工資訊科和台灣科技大學資訊工程系,曾在桃機航警局服役。我熱愛自然也熱愛科學,喜歡和別人分享自己的知識與經驗。如果你有興趣認識我,可以加我的Facebook,並且請註明是從MagicLen來的。

相關文章