Link text 的字符串资源。Android 突出显示 TextView 中的链接,但它们不响应点击。我究竟做错了什么?我必须在我的活动中为 TextView 设置一个 onClickListener 吗?看起来它与我定义字符串资源的方式有关。这不起作......" /> Link text 的字符串资源。Android 突出显示 TextView 中的链接,但它们不响应点击。我究竟做错了什么?我必须在我的活动中为 TextView 设置一个 onClickListener 吗?看起来它与我定义字符串资源的方式有关。这不起作......"> Link text 的字符串资源。Android 突出显示 TextView 中的链接,但它们不响应点击。我究竟做错了什么?我必须在我的活动中为 TextView 设置一个 onClickListener 吗?看起来它与我定义字符串资源的方式有关。这不起作......" />
ChatGPT解决这个技术问题 Extra ChatGPT

如何使 TextView 中的链接可点击

我定义了以下 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:autoLink="web" 这是需要添加到 xml 的主线,它的工作原理就像魅力。谢谢@理查德
<string name="txtCredits"><a href="google.com">www.google.com</a></string> 使用上面的 ststring 就可以了。据了解,href 中的字符串和锚标签中的 with 必须相同,并且有 .com 或.* 工作需要检查原因
<string name="txtCredits">Some text here<a href="google.com">Google</a></string> 对于上面的代码片段点击 Some text here should not work in my case 我该怎么办?
android:focusable="true" 解决了我的问题

P
Peter Mortensen

埋在 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"/>

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

重要提示:如果您调用 setMovementMethod(),请不要忘记删除 autoLink="web"


也许只有我一个人,但你为什么要用 EditText 来做呢?
原来只需要 setMovementMethod 来实现目标。
正如评论一样,我看到一些带有 OS 4.3 的三星 Galaxy S3 在使用“setMovementMethod(LinkMovementMethod.getInstance())”时会崩溃,所以请考虑到这一点,我必须在添加之前创建验证
同样在这里。请注意,如果调用 setMovementMethod(),则必须在 XML 文件中删除 autolink="web",否则链接将不起作用。感谢您的评论
只需在您的 xml 中使用“autoLink”属性,例如:android:autoLink = “web”
J
Janusz

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

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


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

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

如果您的 HTML 中有完整链接,则 android:autoLink="web" 有效。以下内容将以蓝色突出显示并可点击:

一些文字 http://www.google.com 一些文字 http://www.google.com

view.setMovementMethod(LinkMovementMethod.getInstance());将使用以下内容(将突出显示并可点击):

一些文本 http://www.google.com 一些文本 http://www.google.com 一些文本 转到谷歌

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

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

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


setMovementMethod 不适用于您提到的第二个选项,即 google.com .. 任何更新?
感谢您指出 <a href="http://www.google.com">Go to Google</a> 不适用于 autoLink。对于这么多关于 SO 的答案,这是唯一提到它的答案。谢谢!
P
Peter Mortensen

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

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

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


这将在每次执行此代码时创建一个 HTML 解析器。请注意,如果您使用它在列表项内或应用程序中的其他性能关键位置创建链接。在创建列表项期间,这会使我的 getView 方法的执行时间减少 50%
另请注意,URL 中的空格必须替换为 %20
您可以通过将字符串包装在 <![CDATA[ ... ]]> 标记中来避免实体编码问题。
对我有用,谢谢。不适用于 <![CDATA[...]]> 标记。
这应该是答案!与我的本机应用程序完美配合
P
Peter Mortensen

我只是用这个:

Linkify.addLinks(TextView, Linkify.ALL);

它使链接可点击,给定 here


这个答案是最好的。适用于每个 Android 版本,我们只需要在 TextView 中设置文本时添加该方法。奖励:它允许我们添加可点击的可定制链接
真正最简单和最好的答案。它同时适用于电子邮件/网络....谢谢伙计!
如果您需要一些较新的高级功能,请使用 LinkifyCompat
很好,它使没有 <a href... 的网址可点击
链接失效了
P
Peter Mortensen

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

添加类似 HTML 的资源字符串:Google

将您的视图添加到布局中,根本没有特定于链接的配置: `

以编程方式将适当的 MovementMethod 添加到您的 TextView: mLink = (TextView) findViewById(R.id.link); if (mLink != null) { mLink.setMovementMethod(LinkMovementMethod.getInstance()); }

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


+1 你是对的。应该有一个选项可以输入您自己的模式,以便匹配。这样子就很傻了。
P
Peter Mortensen

以下内容适用于在 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,如下所示:

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


这很好用,但是当你从打开的网络中按下返回时,只关闭浏览器,而不是返回到应用程序。
重要提示:如果您正在调用 setMovementMethod(),请不要忘记删除 autoLink="web"。
谢谢。它在我的项目上完美运行。
4
4 revs, 4 users 88%

我在 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" />

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>

P
Peter Mortensen

我希望这能帮到您;

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

这很好用。还要确保从 TextView 中删除 android:autoLink=?
这最终对我有用。有效的 HTML 和不使用 android:autoLink=? 很重要!
对于 Xamarin,单词显示但没有下划线,并且不能使用上述参数而不是这些参数单击:autoLink、linksClickable
对于 Xamarin 设置这些和设置 Text 或设置 TextFormatted 也会产生单词,但它不可点击也不蓝色/下划线。删除自动链接也失败。仅删除 linksClickable 也会失败。删除两者也失败。
helloWorld.TextFormatted = Html.FromHtml (linkURL);有和没有那些也失败了。 (未链接,非蓝色,无法点击)
P
Peter Mortensen

对我来说最简单的方法是使用 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。


是的,但它们不会是可点击的。
链接是可点击的。
P
Peter Mortensen

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

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

R
Reed

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

android:autoLink="all"

这应该是这样的。

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

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

另外,这是事实:只要您设置了 autoLink 和 linksClickable,不要忘记将其添加到 String.xml 文件中,以便可点击链接起作用。

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

对我不起作用。该链接确实是可点击的,但会显示整个字符串,而不仅仅是“Google”。事实上,到目前为止,这里的任何答案或它们的组合都不起作用。
您的设备或模拟器是否启用了互联网并将其设置为开启(wifi)或连接了 LAN,@Violet Giraffe?
这是。我从未设法仅使用 XML 属性使链接可点击,为此不得不求助于 Java 代码。这没什么大不了的,但不是很好。
我和紫罗兰有同样的问题,当然希望有人能解决这个问题。
P
Peter Mortensen

同时管理 Linkify 文本颜色

https://i.stack.imgur.com/hCBt1.png

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

P
Peter Mortensen

通过使用 linkify

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

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

不要忘记

import android.widget.TextView;

P
Peter Mortensen

这是一个非常单行的 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);

a
aLearner

我注意到这样使用 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"/>

它就像一个魅力。


P
Peter Mortensen

接受的答案是正确的,但是这意味着电话号码、地图、电子邮件地址和常规链接(例如,没有 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";默认情况下是真的。


对我来说,没有这个就可以了,接受的答案很好@Kelly你能告诉你遇到问题的android版本和设备吗?
不适用于 myapp:// 方案(用于深度链接)。
语法突出显示似乎关闭。例如“text.length()”附近。是吗?
P
Piyush

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


P
Peter Mortensen

你只需要这个:

android:autoLink="web"

将此行插入到一个 TextView 中,该 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" />

P
Peter Mortensen

用这个...

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

这会起作用,但请记住,除了这个可点击的 TextView 之外,该应用程序可能不需要 Internet 权限。在这些情况下可能会矫枉过正
它真的与问题有关吗?
这与问题无关。
这永远不会失败!
我喜欢这种方法,因为它允许我们只显示锚文本而不是完整的 URL。锚文本也可以设置样式,例如绿色和下划线。
P
Peter Mortensen

这就是我解决 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>"));
}

但我想查看文本并在单击文本时重定向到链接(由浏览器打开)?这个解决方案不能解决这个问题,是吗?
P
Peter Mortensen

使用以下代码:

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

B
Benny

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

P
Peter Mortensen

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

文件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 text1link text2 的可点击超链接,将用户重定向到 Google。


A
Akexorcist

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

字符串.xml

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

P
Peter Mortensen

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

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


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

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

在字符串中标识您的链接,例如“这是我的网页”。您可以将其添加到 XML 内容或代码中。在具有 TextView 的 XML 内容中,添加以下内容: android:linksClickable="true" android:autoLink="web"


P
Peter Mortensen

我只是浪费了很多时间来弄清楚你必须使用 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>

这更加直接且易于使用。因此,我在动态添加的 TextView 中有多个带有自定义文本的链接。这需要尽可能多的支持。对跨区字符串、自定义 TextViews 和 HtmlCompat.fromHtml 方法感到头疼。非常感谢@luca992。
E
E_net4 - Mr Downvoter

在你的编辑文本中添加这个:

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

f
farhanjk

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

享受!

https://i.stack.imgur.com/83Wkz.png