如何使TextView中的链接可点击

我定义了以下TextView:

<TextViewandroid: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"/>

其中@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。

655235 次浏览

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

我能猜到的一件事是链接上方有其他视图。透明的东西填满了整个父级,但不会在链接上方显示任何内容。在这种情况下,单击转到此视图而不是链接。

出现问题的原因是它只尝试匹配“裸”地址,比如“www.google.com”或“http://www.google.com”。

通过Html.fromHtml()运行文本应该可以做到这一点。您必须以编程方式执行此操作,但它有效。

在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上的大部分属性,以匹配演示中的内容。

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

这解决了问题。很难发现和修复。

重要:如果您拨打setMovementMethod(),请不要忘记删除autoLink="web"

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

private void setAsLink(TextView view, String url){Pattern pattern = Pattern.compile(url);Linkify.addLinks(view, pattern, "http://");view.setText(Html.fromHtml("<a href='http://" + url + "'>http://" + url + "</a>"));}

在正确格式化的HTML链接(例如<a href="http://www.google.com/">Google</a>)上使用setMovementMethod(LinkMovementMethod.getInstance())Html.fromHTML()时,请确保没有使用setAutoLinkMask(Linkify.ALL)

上面的解决方案对我不起作用,但下面的解决方案对我起作用了(而且看起来更清晰)。
首先,在字符串资源中,使用超文本标记语言实体编码定义标记开口符号,即:

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

没有

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

一般来说,像这样编码字符串中的所有符号。顺便说一句,链接必须以http://开头

然后(建议这里)在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)));

就是这样。不需要常规表达或其他手动操作。

您只需要在XML的文本视图中添加以下内容:

<TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:autoLink="web"/>

如果要添加类似超文本标记语言的链接,只需:

  • 添加类似超文本标记语言的资源字符串:

      <string name="link"><a href="https://www.google.pl/">Google</a></string>
  • 使用链接特定配置将您的视图添加到布局中:

      <TextViewandroid:id="@+id/link"android:text="@string/link" />`
  • 以编程方式将适当的MovementWay添加到您的TextView:

      mLink = (TextView) findViewById(R.id.link);if (mLink != null) {mLink.setMovementMethod(LinkMovementMethod.getInstance());}

就是这样!是的,像“自动链接”和“链接可点击”这样的选项只适用于显式链接(不包装成超文本标记语言标签)对我来说也是非常误导的…

我注意到这样使用android:autoLink="web"

<TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:autoLink="web"/>

对于URL工作正常,但由于我有一个电子邮件地址和电话号码,我也想链接,我最终使用了这一行android:autoLink="all",就像这样

<TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:autoLink="all"/>

它就像一个魅力。

用这个…

TextView.setOnClickListener(new OnClickListener() {
@Overridepublic void onClick(View v) {// TODO Auto-generated method stubIntent in=new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.twitter.com/"));startActivity(in);}                    
});

并在清单文件中添加权限:

<uses-permission android:name="android.permission.INTERNET"/>

我不得不在几个地方寻找这个,但我终于得到了这个版本的代码。

文件strings.xml

<string name="name1">&lt;a href="http://www.google.com">link text1&lt;/a></string><string name="name2">&lt;a href="http://www.google.com">link text2&lt;/a></string>

文件myactivity.xml

<TextViewandroid:id="@+id/textview1"android:layout_height="wrap_content"android:layout_width="wrap_content"android:layout_marginTop="5dp" />
<TextViewandroid:id="@+id/textview2"android:layout_height="wrap_content"android:layout_width="wrap_content"android:layout_marginTop="5dp" />

文件myactivty.java(在onCreate()中):

TextView tv1 = (TextView)findViewById(R.id.textview1);TextView tv2 = (TextView)findViewById(R.id.textview2);
tv1.setText(Html.fromHtml(getResources().getString(R.string.name1)));tv2.setText(Html.fromHtml(getResources().getString(R.string.name2)));tv1.setMovementMethod(LinkMovementMethod.getInstance());tv2.setMovementMethod(LinkMovementMethod.getInstance());

这将创建两个带有文本link text1link text2的可点击超链接,将用户重定向到Google。

你只需要这个:

android:autoLink="web"

将此行插入到可以通过引用Web单击的TextView中。URL设置为此TextView的文本。

示例:

 <TextViewandroid:id="@+id/textViewWikiURL"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="20sp"android:textStyle="bold"android:text="http://www.wikipedia.org/"android:autoLink="web" />

自动链接电话对我不起作用。以下工作就像一个魅力,

TextView tv = (TextView) findViewById(R.id.emergencynos);String html2="<br><br>Fire - <b><a href=tel:997>997</a> </b></br></br>";tv.append(Html.fromHtml(html2));tv.setMovementMethod(LinkMovementMethod.getInstance());

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

  1. 在字符串中标识您的链接,例如“this is my WebPage”。您可以将其添加到XML内容或代码中。

  2. 在具有TextView的XML内容中,添加以下内容:

     android:linksClickable="true"
    android:autoLink="web"

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

android:autoLink="all"

这应该是这样的。

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

您不需要使用此代码(t2.setMovementMethod(LinkMovementMethod.getInstance());)来使链接可点击。

另外,事实是:只要你设置了autoLink链接可点击,不要忘记在String.xml文件中添加这个,这样可点击的链接就可以工作。

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

我希望这对你有帮助;

String value = "<html>Visit my blog <a href=\"http://www.maxartists.com\">mysite</a> View <a href=\"sherif-activity://myactivity?author=sherif&nick=king\">myactivity</a> callback</html>";TextView text = (TextView) findViewById(R.id.text);
text.setText(Html.fromHtml(value));text.setMovementMethod(LinkMovementMethod.getInstance());

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

  • 如果您的超文本标记语言中有完整链接,则android:autoLink="web"有效。以下内容将以蓝色突出显示并可点击:
  • 一些文本<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"确实不是适用于此类链接。

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

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

我将这行添加到TextViewandroid:autoLink="web"

下面是布局文件中的用法示例。

layout.xml

<TextViewandroid:id="@+id/txtLostpassword"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:autoLink="email"android:gravity="center"android:padding="20px"android:text="@string/lostpassword"android:textAppearance="?android:attr/textAppearanceSmall" />
<TextViewandroid:id="@+id/txtDefaultpassword"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center"android:autoLink="web"android:gravity="center"android:padding="20px"android:text="@string/defaultpassword"android:textAppearance="?android:attr/textAppearanceSmall" />

string.xml

<string name="lostpassword">If you lost your password please contact <a href="mailto:support@cleverfinger.com.au?Subject=Lost%20Password" target="_top">support@cleverfinger.com.au</a></string>
<string name="defaultpassword">User Guide <a href="http://www.cleverfinger.com.au/user-guide/">http://www.cleverfinger.com.au/user-guide/</a></string>

我只是用了这个:

Linkify.addLinks(TextView, Linkify.ALL);

它使链接可点击,给定这里

使用下面的代码:

String html = "<a href=\"http://yourdomain.com\">Your Domain Name</a>"TextView textview = (TextView) findViewById(R.id.your_textview_id);textview.setMovementMethod(LinkMovementMethod.getInstance());textview.setText(Html.fromHtml(html));

通过使用linkify

Linkify获取一段文本和一个正则表达式,并将文本中的所有regex匹配项转换为可点击的链接:

TextView textView = (TextView) findViewById(R.id.textView);textView.setText("http://example.com");Linkify.addLinks(textView, Linkify.WEB_URLS);

别忘了

import android.widget.TextView;

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

Strings.xml

<string name="txtCredits"><![CDATA[<a href=\"http://www.google.com\">Google</a>]]></string>

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

<TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginRight="10dp"android:textSize="18dp"android:autoLink="all"android:text="@string/twitter"android:onClick="twitter"/>
public void twitter (View view){try{Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://twitter.com/onaclovtech"));startActivity(browserIntent);}finally{}}

它不需要任何权限,因为您将意图传递给管理这些资源的应用程序(即浏览器)。

这是什么为我工作。

我只是浪费了很多时间来弄清楚你必须使用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());
<TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/termsTextView"/>

字符串示例:

    <string name="stripe_connected_account_agreement"><a href="https://stripe.com/connect/account-terms">Stripe Connected Account Agreement</a></string>

由于数据库绑定已经出来了,我想分享我的解决方案,用于支持具有可点击链接的超文本标记语言标签的数据库绑定TextView。

为了避免检索每个文本视图并使用From.html为它们提供html支持,我们扩展了TextView并将逻辑放在setText()

public class HtmlTextView extends TextView {
public HtmlTextView(Context context) {super(context);}
public HtmlTextView(Context context, AttributeSet attrs) {super(context, attrs);}
public HtmlTextView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}
@Overridepublic void setText(CharSequence text, BufferType type) {super.setText(Html.fromHtml(text.toString()), type);this.setMovementMethod(LinkMovementMethod.getInstance());}}

我有提出了要点,它还显示了使用它的示例实体和视图。

我的代码是这样的:

<TextViewandroid:layout_width="fill_parent"android:layout_height="fill_parent"android:id="@+id/link"android:text="@string/forgot"android:layout_marginTop="16dp"android:gravity="center"android:linksClickable="true"/>

我的Java代码是这样的:

/*TextView action*/TextView textView = (TextView) findViewById(R.id.link);textView.setMovementMethod(LinkMovementMethod.getInstance());textView.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {startActivity(new Intent(LoginActivity.this,forgot.class));}});

这只是指向另一个活动的链接。但该链接是可点击的,并且运行顺利。在Android Studio 1.5(预览版)中测试

接受的答案是正确的,这意味着电话号码,地图,电子邮件地址和常规链接,例如,没有href标签的http://google.com不再可点击,因为您不能在XML内容中拥有自动链接。

我找到的唯一具有一切可点击性的完整解决方案如下:

Spanned text = Html.fromHtml(myString);URLSpan[] currentSpans = text.getSpans(0, text.length(), URLSpan.class);SpannableString buffer = new SpannableString(text);Linkify.addLinks(buffer, Linkify.ALL);for (URLSpan span : currentSpans) {int end = text.getSpanEnd(span);int start = text.getSpanStart(span);buffer.setSpan(span, start, end, 0);}textView.setText(buffer);textView.setMovementMethod(LinkMovementMethod.getInstance());

TextView应该没有android:autolink。也不需要android:linksClickable="true";默认情况下为true。

这是一个非常单行的Android代码,无论字符串是什么,数据是什么,都可以从文本视图中选择电话和URL。您不需要为此使用任何超文本标记语言标签。

TextView textView = (TextView)findViewById(R.id.textView1);textView.setText("some URL is www.google.com phone 7504567890 another URL lkgndflg.com ");
// Makes the textView's Phone and URL (hyperlink) select and go.Linkify.addLinks(textView, Linkify.WEB_URLS | Linkify.PHONE_NUMBERS);

对我来说最简单的事情就是使用Linkify

TextView txt_Message = (TextView) view.findViewById(R.id.txt_message);txt_Message.setText("This is link https://www.google.co.in/");Linkify.addLinks(txt_Message, Linkify.WEB_URLS);

它会自动从文本视图中的文本中检测Web URL。

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

string.xml

<string name="applink">Looking for Digital Visiting card?<a href="https://play.google.com/store/apps/details?id=com.themarkwebs.govcard">Get it here</a></string>

现在你可以像这样在任何给定的View中使用这个string

<TextViewandroid:id="@+id/getapp"android:layout_width="match_parent"android:layout_height="50dp"android:gravity="center"android:textColor="@color/main_color_grey_600"android:textSize="15sp"android:text="@string/applink"/>

现在,在你的活动或片段中,执行以下操作:

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

到目前为止,您不需要使用这种方法设置android:autoLink="web"android:linksClickable="true"

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

您可以从后端或资源文件中获取超文本标记语言字符串。如果您将文本作为资源字符串,请确保添加CDATA标记:

<string name="your_text">![CDATA[...<a href="your_link">Link Title</a>  ...]]</string>

然后在代码中,您需要获取字符串并将其分配为超文本标记语言并设置链接移动方法:

String yourText = getString(R.string.your_text);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {textView.setText(Html.fromHtml(yourText, Html.FROM_HTML_MODE_COMPACT));} else {textView.setText(Html.fromHtml(yourText));}
try {subtext.setMovementMethod(LinkMovementMethod.getInstance());} catch (Exception e) {//This code seems to crash in some Samsung devices.//You can handle this edge case base on your needs.}

管理链接文本颜色

在此处输入图片描述

tv_customer_care_no.setLinkTextColor(getResources().getColor(R.color.blue));tv_customer_care_no.setText("For us to reach out to you, please fill the details below or contact our customer care at 18004190899 or visit our website http://www.dupont.co.in/corporate-links/contact-dupont.html");Linkify.addLinks(tv_customer_care_no, Linkify.WEB_URLS | Linkify.PHONE_NUMBERS);Linkify.addLinks(tv_customer_care_no, Linkify.ALL);

在SpannableString上创建一个扩展方法:

private fun SpannableString.setLinkSpan(text: String, url: String) {val textIndex = this.indexOf(text)setSpan(object : ClickableSpan() {override fun onClick(widget: View) {Intent(Intent.ACTION_VIEW).apply { data = Uri.parse(url) }.also { startActivity(it) }}},textIndex,textIndex + text.length,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)}

使用它使TextView中的字符串可点击:

    myTextView.apply {movementMethod = LinkMovementMethod.getInstance()
val googleUrl = "http://www.google.com"val microsoftUrl = "http://www.microsoft.com"
val google = "Google"val microsoft = "Microsoft"
val message = SpannableString("$google & $microsoft").apply {setLinkSpan(google, googleUrl)setLinkSpan(microsoft, microsoftUrl)}
text = message}

好好享受!

在此处输入图片描述

使用这个:

package com.stackoverflow.java.android;
import android.content.Context;import android.text.method.LinkMovementMethod;import android.text.method.MovementMethod;import android.util.AttributeSet;
import androidx.annotation.Nullable;import androidx.appcompat.widget.AppCompatTextView;
public class HyperlinkTextView extends AppCompatTextView {public HyperlinkTextView(Context context) {super(context);}
public HyperlinkTextView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);}
public HyperlinkTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}
/*** Set default movement method to {@link LinkMovementMethod}* @return Link movement method as the default movement method*/@Overrideprotected MovementMethod getDefaultMovementMethod() {return LinkMovementMethod.getInstance();}}

现在,只需在布局文件中使用com.stackoverflow.java.android.HyperlinkTextView而不是TextView就可以解决您的问题。

对于那些在字符串读取XML内容和动态分配方面遇到问题的人。

如果您使用来自strings.xml资源的文本,则似乎超文本标记语言标签被剥离

因此,您必须在strings.xml文件中使用<![CDATA[**your string with click links**]]>将其转换为使用Html.fromHtml(string)的超文本标记语言。

将此添加到您的EditText:

android:autoLink="web"android:linksClickable="true"

您可以简单地添加链接到您的TextView与Android的Linkify库

添加到您的strings.xml

<string name="text_legal_notice">By continuing, you confirm that you have read, understood and agreed to our %1$s and %2$s.</string><string name="text_terms_conditions">Terms &amp; Conditions</string><string name="text_privacy_policy">Privacy Policy</string>

添加到您的活动

final String termsConditionsText = getString(R.string.text_terms_conditions);final String privacyPolicyText = getString(R.string.text_privacy_policy);final String legalText = getString(R.string.text_legal_notice,termsConditionsText,privacyPolicyText);viewBinding.textViewLegalNotice.setText(legalText);
Linkify.addLinks(viewBinding.textViewLegalNotice,Pattern.compile(termsConditionsText),null,null,(match, url) -> "https://policies.google.com/terms");Linkify.addLinks(viewBinding.textViewLegalNotice,Pattern.compile(privacyPolicyText),null,null,(match, url) -> "https://policies.google.com/privacy");