如何在TextView中单击链接?

Ric*_*ard 950 android hyperlink textview clickable

我定义了以下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>
Run Code Online (Sandbox Code Playgroud)

where @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>
Run Code Online (Sandbox Code Playgroud)

但这样做:

<string name="txtCredits">www.google.com</string>
Run Code Online (Sandbox Code Playgroud)

这是一个无赖,因为我宁愿显示文本链接而不是显示完整的URL.

Ric*_*ard 1194

在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());
Run Code Online (Sandbox Code Playgroud)

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

<TextView
    android:id="@+id/text2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/txtCredits"/>
Run Code Online (Sandbox Code Playgroud)

这解决了它.很难发现和修复.

重要提示:autoLink="web"如果您打电话,请不要忘记删除setMovementMethod().

  • 同样在这里.请注意,如果调用setMovementMethod(),则必须删除XML文件中的autolink ="web",否则链接将不起作用.感谢您的评论 (39认同)
  • 也许这只是我,但为什么你会用EditText做到这一点? (18认同)
  • 只需在xml中使用"autoLink"属性即可:例如:android:autoLink ="web" (5认同)
  • 就像一个提交,我看到一些带有OS 4.3的三星Galaxy S3在使用"setMovementMethod(LinkMovementMethod.getInstance())"时崩溃,所以考虑到这一点,我必须在添加之前创建验证 (3认同)
  • 你能否发布@ string/txtCredits的值? (2认同)
  • `setMovementMethod`在API = 15时不起作用,有或没有autoLink ="web" (2认同)

Jan*_*usz 511

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

我可以猜到的一件事是其他一些观点在链接之上.透明的东西填充整个父母,但不显示链接上方的任何内容.在这种情况下,单击将转到此视图而不是链接.

  • 不,不是,因为如果您不想使用带有与URL不同的显示文本的锚标记,则此答案不起作用 (51认同)
  • 如果你使用linkify auto,你不需要一个href部分.操作系统会将字符串解析为网址,并将每个网址转换为可点击的链接.但这不会导致google与google.com相关联.它会将www.google.com显示为链接. (6认同)
  • 上面添加了更多信息.这可能是我将字符串定义为<string name ="txtCredits"> <a rel="nofollow noreferrer" href="http://www.google.com"> Google </a> </ string>的方式吗?看起来这是允许的,但它不适合我. (3认同)
  • android:autoLink也适用于链接电话号码,地址和电子邮件地址(或以上所有). (2认同)
  • 是的,它有效!您可以使用 xml 中的此属性更改链接颜色。`android:textColorLink="#03A9F4"` (2认同)

Jes*_*run 347

花了一些时间,我发现:

  • 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"确实不是这样的联系工作.

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

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

  • 感谢您指出"<a rel="nofollow noreferrer" href="http://www.google.com"> Go to Google </a>"不适用于autoLink.关于SO的这么多答案,这是唯一提到它的答案.谢谢! (12认同)

Bła*_*app 92

以上解决方案对我不起作用,但以下做了(而且看起来有点清洁).
首先,在字符串资源中,使用HTML实体编码定义标记打开的V形符号,即:

&lt;a href="http://www.google.com">Google&lt;/a>
Run Code Online (Sandbox Code Playgroud)

并不是:

<a href="http://www.google.com">Google</a>
Run Code Online (Sandbox Code Playgroud)

通常,像这样编码字符串中的所有V形符号.顺便说一句,链接必须从http://

然后(如此处所示)在TextView上设置此选项:

 android:linksClickable="true"
Run Code Online (Sandbox Code Playgroud)

最后,在代码中,执行:

((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)));
Run Code Online (Sandbox Code Playgroud)

就是这样,不需要正则表达式或其他手动黑客攻击.

  • 每次执行此代码时,这将创建一个HTML Parser.请注意,如果您使用此链接在列表项内或应用中其他性能关键位置创建链接.在创建listitem期间,这会将getView方法的执行时间延长50% (7认同)

小智 64

我简单地使用了这个

Linkify.addLinks(TextView, Linkify.ALL);
Run Code Online (Sandbox Code Playgroud)

使链接可点击这里给出

  • 这个答案是最好的.适用于每个Android版本,我们只需要在TextView中设置文本时添加该方法.额外奖励:它允许我们添加可自定义的可点击链接 (3认同)
  • 真的最简单,最好的答案.它同时适用于电子邮件/网络....谢谢你! (3认同)
  • 如果您需要一些较新的高级功能,请使用 LinkifyCompat (2认同)

viz*_*izZ 61

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

而已!是的,像"autoLink"和"linksClickable"这样的选项只用于显式链接(不包含在html标签中)对我来说也是非常误导的......

  • +1 你说得对。应该有一个选项可以输入您自己的模式,以便匹配。这样就很傻了。 (2认同)

Sha*_*waj 46

我将此行添加到TextView:android:autoLink="web"
下面是布局文件中的用法示例.

layout.xml 样品

    <TextView
        android: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" />

    <TextView
        android: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" />
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)


小智 25

只需要在xml的文本视图中添加它

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:autoLink="web"/>
Run Code Online (Sandbox Code Playgroud)


Beb*_*T.N 25

我希望这能帮到您;

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());
Run Code Online (Sandbox Code Playgroud)

  • 这非常有效.还要确保从`TextView`中删除`android:autoLink =?`. (3认同)

Ase*_*rge 23

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

string.xml:

<string name="applink">Looking for the regular Zesteve App? 
<a href="https://play.google.com/store/apps/details?id=prokart.in.app">Get it here</a>
</string>
Run Code Online (Sandbox Code Playgroud)

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

<TextView
    android: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"/>
Run Code Online (Sandbox Code Playgroud)

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

TextView getapp =(TextView) findViewById(R.id.getapp);
getapp.setMovementMethod(LinkMovementMethod.getInstance());
Run Code Online (Sandbox Code Playgroud)

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

我希望你会发现这很有帮助.


pks*_*pks 20

对我有用的最简单的事情是使用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);
Run Code Online (Sandbox Code Playgroud)

它将自动检测textview中文本的网址.


Kes*_*era 20

还管理 Linkify 文本颜色

在此处输入图片说明

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);
Run Code Online (Sandbox Code Playgroud)


Dav*_*nta 19

理查德,下次,您应该在布局XML的TextView下添加此代码.

android:autoLink="all"
Run Code Online (Sandbox Code Playgroud)

这应该是这样的.

<TextView 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:text="@string/txtCredits"
    android:id="@+id/infoTxtCredits"
    android:autoLink="all"
    android:linksClickable="true">
</TextView>
Run Code Online (Sandbox Code Playgroud)

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

另外,这是事实:只要你设置了autoLinklinksClickable,不要忘记在String.xml文件中添加它,以便可点击链接起作用.

<string name="txtCredits"><a href="http://www.google.com">Google</a></string>
Run Code Online (Sandbox Code Playgroud)

  • 对我不起作用.该链接确实是可点击的,但显示的是整个字符串,而不仅仅是"Google".事实上,到目前为止,这里的答案或其组合都不起作用. (3认同)

Dea*_*hRs 16

通过使用linkify: Linkify获取一段文本和正则表达式,并将文本中的所有正则表达式匹配转换为可单击的链接

TextView textView = (TextView) findViewById(R.id.textView);
textView.setText("http://www.domain.com");
Linkify.addLinks(textView, Linkify.WEB_URLS);
Run Code Online (Sandbox Code Playgroud)

别忘了

import android.widget.TextView;
Run Code Online (Sandbox Code Playgroud)


Rah*_*ina 14

这里有一行android代码,无论什么是字符串,什么是数据,都可以从textView中选择手机和网址.您不需要为此使用任何HTML标记.

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);
Run Code Online (Sandbox Code Playgroud)


aLe*_*ner 13

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

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content" 
    android:autoLink="web"/>
Run Code Online (Sandbox Code Playgroud)

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

<TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content" 
        android:autoLink="all"/>
Run Code Online (Sandbox Code Playgroud)

它就像一个魅力.


小智 13

将其添加到您的 EditText 中:

android:autoLink="web"
android:linksClickable="true"
Run Code Online (Sandbox Code Playgroud)


小智 11

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


小智 10

你只需要这个:

android:autoLink="web"
Run Code Online (Sandbox Code Playgroud)

将此行插入TextView,可以参考Web进行单击.URL地址设置为此TextView的文本.

例:

 <TextView
    android: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" />
Run Code Online (Sandbox Code Playgroud)


小智 8

用这个...

TextView.setOnClickListener(new OnClickListener() {

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

                });
Run Code Online (Sandbox Code Playgroud)

并在清单文件中添加权限

<uses-permission android:name="android.permission.INTERNET"/>
Run Code Online (Sandbox Code Playgroud)

  • 它真的与这个问题有关吗? (2认同)
  • 这与问题无关. (2认同)

小智 8

接受的答案是正确的,但这意味着电话号码,地图,电子邮件地址和常规链接(例如http://google.com没有href标签)将不再可点击,因为您无法在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());
Run Code Online (Sandbox Code Playgroud)

TextView不应该有android:autolink.也没有必要android:linksClickable="true"; 这是默认的.


Dom*_*rtl 7

这就是我在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>"));
    }
Run Code Online (Sandbox Code Playgroud)


deg*_*ser 6

我不得不在几个地方找到它,但我终于让这个版本的代码可以工作。

文件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>
Run Code Online (Sandbox Code Playgroud)

文件myactivity.xml

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

<TextView
    android:id="@+id/textview2"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_marginTop="5dp" />
Run Code Online (Sandbox Code Playgroud)

文件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());
Run Code Online (Sandbox Code Playgroud)

这将创建一个文本的两种可点击超链接link text1link text2该用户重定向到谷歌。


Phu*_*ran 6

使用以下代码:

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));
Run Code Online (Sandbox Code Playgroud)


Ben*_*nny 6

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

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

<string name="your_text">![CDATA[...<a href="your_link">Link Title</a>  ...]]</string>
Run Code Online (Sandbox Code Playgroud)

然后在代码中,您需要获取字符串并将其指定为HTML并设置链接移动方法:

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.
}
Run Code Online (Sandbox Code Playgroud)


far*_*njk 6

在 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
    )
}
Run Code Online (Sandbox Code Playgroud)

使用它使 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
    }
Run Code Online (Sandbox Code Playgroud)

享受!

在此输入图像描述


Jer*_*gan 5

你遇到问题的原因是它只试图匹配"裸"地址.诸如"www.google.com"或" http://www.google.com "之类的内容.

通过Html.fromHtml()运行文本应该可以解决问题.你必须以编程方式进行,但它确实有效.

  • TextView中的链接与字符串中的其他文本颜色不同,因此我认为它们被识别为链接.他们只是不可点击:-( (2认同)

cod*_*ood 5

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

  1. 标识字符串中的链接,例如“这是我的网页”。您可以将其添加到 XML 内容或代码中。

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

     android:linksClickable="true"
    
     android:autoLink="web"
    
    Run Code Online (Sandbox Code Playgroud)


Ake*_*ist 5

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

字符串.xml

<string name="txtCredits"><![CDATA[<a href=\"http://www.google.com\">Google</a>]]></string>
Run Code Online (Sandbox Code Playgroud)


luc*_*992 5

我只是浪费了很多时间来弄清楚你必须使用 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"/>
Run Code Online (Sandbox Code Playgroud)

字符串示例:

    <string name="stripe_connected_account_agreement"><a href="https://stripe.com/connect/account-terms">Stripe Connected Account Agreement</a></string>
Run Code Online (Sandbox Code Playgroud)