1104

我定义了以下 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>

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>

但这确实:

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

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

4

36 回答 36

1317

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

文件链接.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()

于 2010-04-30T18:18:12.503 回答
576

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

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

于 2010-04-29T07:13:43.527 回答
432

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

  • 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());确保您的 XML 布局中没有。android:autoLink="web"

于 2013-12-17T23:45:52.177 回答
102

上述解决方案对我不起作用,但以下解决方案有效(而且看起来更干净)。
首先,在字符串资源中,使用 HTML 实体编码定义您的标签开头 V 形,即:

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

不是

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

通常,像这样对字符串中的所有 V 形进行编码。顺便说一句,链接必须以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)));

而已。不需要正则表达式或其他手动技巧。

于 2012-04-12T13:58:59.473 回答
82

我只是用这个:

Linkify.addLinks(TextView, Linkify.ALL);

它使链接可点击,在这里给出。

于 2014-03-26T13:00:01.100 回答
73

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

  • 添加一个类似 HTML 的资源字符串:

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

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

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

而已!是的,像“autoLink”和“linksClickable”这样的选项只在显式链接上工作(不包含在 HTML 标签中)对我来说也很误导......

于 2012-06-29T10:10:42.090 回答
57

以下内容适用于在 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>

现在您可以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"/>

现在,在您的 Activity 或 Fragment 中,执行以下操作:

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

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

于 2017-07-28T08:26:22.440 回答
51

我将此行添加到TextViewandroid: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" />

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>
于 2014-02-25T02:20:49.030 回答
32

I hope this will help you;

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());
于 2013-06-18T06:14:00.317 回答
29

对我来说最简单的事情是使用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);

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

于 2016-07-29T14:05:14.460 回答
26

您只需要在 XML 的文本视图中添加它:

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:autoLink="web"/>
于 2012-05-08T11:00:08.087 回答
22

Richard, next time, you should add this code under TextView at the layout XML instead.

android:autoLink="all"

This should be like this.

<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>

You don't need to use this code (t2.setMovementMethod(LinkMovementMethod.getInstance());) in order to make the link clickable.

Also, here's the truth: as long as you set the autoLink and the linksClickable, don't forget to add this at String.xml file so that the clickable link will work.

<string name="txtCredits"><a href="http://www.google.com">Google</a></string>
于 2013-04-25T03:20:38.367 回答
22

同时管理 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);
于 2018-06-30T05:41:15.770 回答
21

通过使用linkify

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

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

不要忘记

import android.widget.TextView;
于 2015-02-07T20:15:43.727 回答
19

这是一个非常单行的 Android 代码,无论字符串是什么,数据是什么,都可以从 textView 中选择电话和 URL。您不需要为此使用任何 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);
于 2016-05-28T13:27:33.203 回答
14

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

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

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

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

它就像一个魅力。

于 2012-11-14T10:41:27.653 回答
14

接受的答案是正确的,但这意味着电话号码、地图、电子邮件地址和常规链接(例如,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());

并且 TextView 不应该android:autolink. 两者都不需要android:linksClickable="true";默认情况下是真的。

于 2015-12-01T10:28:13.583 回答
12

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

于 2012-03-21T22:05:53.540 回答
12

You need only this:

android:autoLink="web"

Insert this line into a TextView that can be clickable with a reference to the web. The URL is set as a text of this TextView.

Example:

 <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" />
于 2013-03-25T20:23:47.320 回答
11

用这个...

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);
                    }
                    
                });

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

<uses-permission android:name="android.permission.INTERNET"/>
于 2012-11-22T09:42:08.737 回答
9

这就是我解决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>"));
}
于 2012-01-24T18:56:46.647 回答
9

使用以下代码:

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));
于 2014-08-19T10:03:34.117 回答
8

[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>

然后在代码中,您需要获取字符串并将其分配为 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.
}
于 2018-04-24T20:20:52.603 回答
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>

文件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" />

文件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 text1并将link text2用户重定向到 Google。

于 2013-02-16T23:25:14.737 回答
5

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

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

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

     android:linksClickable="true"
    
     android:autoLink="web"
    
于 2013-04-11T23:36:32.073 回答
5

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

通过Html.fromHtml()运行您的文本应该可以解决问题。您必须以编程方式执行此操作,但它有效。

于 2010-04-30T01:57:32.203 回答
5

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

字符串.xml

<string name="txtCredits"><![CDATA[<a href=\"http://www.google.com\">Google</a>]]></string>
于 2015-02-17T11:21:59.443 回答
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"/>

字符串示例:

    <string name="stripe_connected_account_agreement"><a href="https://stripe.com/connect/account-terms">Stripe Connected Account Agreement</a></string>
于 2015-08-12T20:01:27.077 回答
4

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

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());
于 2013-04-08T05:08:56.050 回答
4

在 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
    }

享受!

在此处输入图像描述

于 2019-04-12T03:11:27.463 回答
3

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

<TextView
    android: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
    {
    }
}

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

这对我有用。

于 2015-07-10T12:33:21.213 回答
3

我的代码是这样的:

<TextView
    android: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() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(LoginActivity.this,forgot.class));
            }
        });  

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

于 2015-11-09T19:31:43.303 回答
1

用这个:

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
     */
    @Override
    protected MovementMethod getDefaultMovementMethod() {
        return LinkMovementMethod.getInstance();
    }
}

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

于 2020-07-19T09:21:17.897 回答
1

对于那些从 XML 内容读取和动态分配字符串有问题的人。

如果您使用的是strings.xml资源中的文本, HTML 标记似乎会被剥离。

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

于 2021-02-09T07:17:39.497 回答
0

随着数据绑定的发布,我想分享我的数据绑定 TextViews 解决方案,它支持带有可点击链接的 HTML 标记。

为了避免检索每个 textview 并使用From.html我们扩展 TextView 并为它们提供 html 支持并将逻辑放入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);
    }

    @Override
    public void setText(CharSequence text, BufferType type) {
        super.setText(Html.fromHtml(text.toString()), type);
        this.setMovementMethod(LinkMovementMethod.getInstance());
    }
}

我做了一个要点,它还显示了示例实体和使用它的视图。

于 2015-09-04T09:36:22.733 回答
0

在您的编辑文本中添加:

        android:autoLink="web"
        android:linksClickable="true"
于 2022-01-30T14:06:43.170 回答