如何使TextView中的链接可点击?

问题描述 投票:960回答:33

我定义了以下TextView:

<TextView android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:text="@string/txtCredits"
    android:autoLink="web" android:id="@+id/infoTxtCredits"
    android:layout_centerInParent="true"
    android:linksClickable="true"></TextView>

其中@string/txtCredits是包含<a href="some site">Link text</a>的字符串资源。

Android在TextView中突出显示了链接,但是它们不响应点击。有人可以告诉我我在做什么错吗?我是否需要为活动中的TextView设置一个onClickListener,就像这样简单?

似乎与我定义字符串资源的方式有关。这不起作用:

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

但是这样做:

<string name="txtCredits">www.google.com</string>

这真是令人讨厌,因为我宁愿显示文本链接也不显示完整的URL。

android hyperlink textview clickable
33个回答
1203
投票

内置在API演示中,我找到了解决问题的方法:

Link.java:

    // text2 has links specified by putting <a> tags in the string
    // resource.  By default these links will appear but not
    // respond to user input.  To make them active, you need to
    // call setMovementMethod() on the TextView object.

    TextView t2 = (TextView) findViewById(R.id.text2);
    t2.setMovementMethod(LinkMovementMethod.getInstance());

我删除了TextView上的大多数属性以匹配演示中的内容。

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

解决了。很难发现和修复。

重要:如果您正在呼叫autoLink="web",请不要忘记删除setMovementMethod()


24
投票

以下内容适用于在Android应用程序中查找文本和超链接组合的任何人。


20
投票

对我来说最简单的方法是使用Linkify


19
投票

Richard,下一次,您应该改为在布局XML的TextView下添加此代码。


16
投票

通过使用linkify


14
投票

这里有一行Android代码,无论字符串和数据是什么,都可以从textView中选择电话和url。您不需要为此使用任何HTML标记。


13
投票

我注意到因此使用了android:autoLink="web"


11
投票

[在正确格式化的setAutoLinkMask(Linkify.ALL)链接(例如,setMovementMethod(LinkMovementMethod.getInstance()))上使用Html.fromHTML()HTML时,请确保


10
投票

您只需要这个:


8
投票

使用此...


8
投票

接受的答案是正确的,但这意味着电话号码,地图,电子邮件地址和常规链接,例如没有href标记的http://google.com将无法再点击,因为您无法在xml中进行自动链接。


516
投票

我仅使用android:autoLink="web",它工作正常。单击链接将打开浏览器并显示正确的页面。

我可以猜测的是链接上方还有其他视图。透明的内容会填充整个父对象,但在链接上方不会显示任何内容。在这种情况下,单击将转到此视图而不是链接。


7
投票

这是我解决TextView中可点击和可见链接的方式(通过代码)


6
投票

使用下面的代码:


6
投票

[Tested in Pre-lollipop as well as in Lollipop and above]


5
投票

您遇到问题的原因是,它仅尝试匹配“裸”地址。例如“ www.google.com”或“ http://www.google.com”。


5
投票

同时管理Linkify文本颜色


4
投票

自动链接电话不适用于我。以下内容非常有魅力,


4
投票

将CDATA添加到您的字符串资源中


3
投票

不知道是否值得添加另一个答案,但以防万一...


3
投票

如果使用基于XML的TextView,根据您的要求,您只需要做两件事:


3
投票

我使用自动链接对文本进行“下划线”,但是只是创建了一个“ onClick”来对其进行管理。 (我自己遇到了这个问题)


353
投票

花了一些时间之后,我发现:

  • android:autoLink="web"如果在HTML中具有完整链接,则可以使用。以下内容将以蓝色突出显示并单击:
  • 某些文本<a href="http://www.google.com">http://www.google.com</a>
  • 某些文本http://www.google.com
  • view.setMovementMethod(LinkMovementMethod.getInstance());将与以下内容一起使用(将突出显示并单击):
  • 某些文本<a href="http://www.google.com">http://www.google.com</a>
  • 某些文本http://www.google.com
  • 某些文本<a href="http://www.google.com">Go to Google</a>

请注意,第三个选项具有超链接,但是链接的描述(标签之间的部分)本身不是链接。android:autoLink="web"NOT是否可用于此类链接。

  • [android:autoLink="web"如果以XML设置将覆盖view.setMovementMethod(LinkMovementMethod.getInstance());(即,第三种链接将突出显示,但不可单击)。

故事的寓意是在代码中使用view.setMovementMethod(LinkMovementMethod.getInstance());,如果希望all链接可单击,请确保XML布局中没有android:autoLink="web"


2
投票

只是浪费了很多时间弄清楚您必须使用getText(R.string.whatever)而不是getString(R.string.whatever ......]

无论如何,这就是我的工作方式。在同一文本视图中也具有多个超链接。

    TextView termsTextView = (TextView) getActivity().findViewById(R.id.termsTextView);
    termsTextView.append("By registering your account, you agree to our ");
    termsTextView.append(getText(R.string.terms_of_service));
    termsTextView.append(", ");
    termsTextView.append(getText(R.string.fees));
    termsTextView.append(", and the ");
    termsTextView.append(getText(R.string.stripe_connected_account_agreement));

    termsTextView.setMovementMethod(LinkMovementMethod.getInstance());



            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:id="@+id/termsTextView"/>

93
投票

上面的解决方案对我来说不起作用,但是下面的解决方案对我来说似乎有效。首先,在字符串资源中,使用HTML实体编码(即:]]定义标签开头的人字形

&lt;a href="http://www.google.com">Google&lt;/a>

并且不是:

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

通常,像这样对字符串中的所有V形进行编码。顺便说一句,链接必须以http://

开头

然后(根据建议here)在TextView上设置此选项:

 android:linksClickable="true"

最后,在代码中,执行:

((TextView) findViewById(R.id.your_text_view)).setMovementMethod(LinkMovementMethod.getInstance());
((TextView) findViewById(R.id.your_text_view)).setText(Html.fromHtml(getResources().getString(R.string.string_with_links)));

就是这样,不需要正则表达式或其他手动技巧。


65
投票

我简单地使用了它


61
投票

如果您想添加类似HTML的链接,您所需要做的就是:


46
投票

我将此行添加到TextViewandroid:autoLink="web"以下是布局文件中用法的示例。


25
投票

您只需要在xml的文本视图中添加此内容


25
投票

希望对您有所帮助;

© www.soinside.com 2019 - 2024. All rights reserved.