2014-10-02 47 views
0

有兩種類型的鏈接,我需要在TextView中製作可點擊的鏈接。在TextView中製作兩種不同類型的鏈接可選擇


第一種類型是輸入爲文本的地址。

實施例:

http://www.google.com


第二種類型是HTML超鏈接。

實施例:

<a href="http://www.google.com">Google</a>

哪個隨後將顯示爲:

Google


我可以通過設置TextView's移動方法以及使用該HTML對象完成2型。

實施例:

holder.txtMyText.setMovementMethod(LinkMovementMethod.getInstance()); 
holder.txtMyText.setText(Html.fromHtml(items.get(position).getText())); 

我可以通過設置TextView'sautoLink參數來完成1型 「網絡」。

例子:

android:autoLink="web"


問題:

如果我設置TextView'sautoLink參數設置爲 「網絡」,它打破了HTML超鏈接。它們顯示爲正常文本,不可點擊。如果我刪除了autoLink參數,則輸入的地址不再可點擊。

我該如何讓兩個工作?

+1

您可以嘗試手動運行'Linkify'與'Html.fromHtml()'的輸出。或者,爲了顯示它們,將裸露的URL包裝在''標籤中。 – CommonsWare 2014-10-02 16:24:35

+0

這是因爲Linkify.addLinks()會刪除已存在於Spannable對象中的每個URLSpan(請參閱http://androidxref.com/4.4_r1/xref/frameworks/base/core/java/android/text/util/Linkify.java #204) – pskink 2014-10-02 16:28:42

回答

1

使用以下正則表達式的工作:

// Match any set of characters starting with `http` but not in `<a></a>` tag 
static final String REGEX = "(?!<a[^>]*?>)(http[^\\s]+)(?![^<]*?</a>)"; 

實施例:

字符串:

<string name="lorem_ipsum"> 
    Lorem ipsum dolor sit amet <a href="http://www.google.com">Google</a> eirmod tempor. 
    \n\n\n\n\n\n 
    At vero eos et accusam et justo duo dolores et ea rebum http://www.google.com clita kasd sed. 
</string> 

佈局:

<TextView 
    android:id="@+id/lorem_ipsum" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="@string/lorem_ipsum" /> 

活動:

TextView tv = (TextView)findViewById(R.id.lorem_ipsum); 
Linkify.addLinks(tv, Pattern.compile(REGEX), "http://"); 

結果:

Screenshot

希望這有助於。

+1

謝謝!這是有效的,但應該提到'tv.setMovementMethod(LinkMovementMethod.getInstance())'是''標籤可以點擊的鏈接所必需的。 – Andrew 2014-10-28 19:44:58