Link text 的字符串资源。Android 突出显示 TextView 中的链接,但它们不响应点击。我究竟做错了什么?我必须在我的活动中为 TextView 设置一个 onClickListener 吗?看起来它与我定义字符串资源的方式有关。这不起作......" /> Link text 的字符串资源。Android 突出显示 TextView 中的链接,但它们不响应点击。我究竟做错了什么?我必须在我的活动中为 TextView 设置一个 onClickListener 吗?看起来它与我定义字符串资源的方式有关。这不起作......"> Link text 的字符串资源。Android 突出显示 TextView 中的链接,但它们不响应点击。我究竟做错了什么?我必须在我的活动中为 TextView 设置一个 onClickListener 吗?看起来它与我定义字符串资源的方式有关。这不起作......" />
我定义了以下 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:focusable="true"
解决了我的问题
埋在 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"
。
我只使用 android:autoLink="web"
,它工作正常。单击链接会打开浏览器并显示正确的页面。
我可以猜到的一件事是链接上方有其他一些视图。透明的东西会填充整个父级,但不会在链接上方显示任何内容。在这种情况下,点击转到此视图而不是链接。
android:textColorLink="#03A9F4"
在花了一些时间之后,我发现:
如果您的 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"
。
<a href="http://www.google.com">Go to Google</a>
不适用于 autoLink。对于这么多关于 SO 的答案,这是唯一提到它的答案。谢谢!
上述解决方案对我不起作用,但以下解决方案有效(而且看起来更干净)。首先,在字符串资源中,使用 HTML 实体编码定义您的标签开头 V 形,即:
<a href="http://www.google.com">Google</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)));
而已。不需要正则表达式或其他手动技巧。
%20
<![CDATA[ ... ]]>
标记中来避免实体编码问题。
<![CDATA[...]]>
标记。
我只是用这个:
Linkify.addLinks(TextView, Linkify.ALL);
它使链接可点击,给定 here。
<a href...
的网址可点击
如果你想添加一个类似 HTML 的链接,你需要做的就是:
添加类似 HTML 的资源字符串:
将您的视图添加到布局中,根本没有特定于链接的配置:
以编程方式将适当的 MovementMethod 添加到您的 TextView: mLink = (TextView) findViewById(R.id.link); if (mLink != null) { mLink.setMovementMethod(LinkMovementMethod.getInstance()); }
而已!是的,像“autoLink”和“linksClickable”这样的选项只在显式链接上工作(不包含在 HTML 标签中)对我来说也很误导......
以下内容适用于在 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"
。
我在 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>
我希望这能帮到您;
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=?
。
android:autoLink=?
很重要!
对我来说最简单的方法是使用 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。
您只需要在 XML 的文本视图中添加它:
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autoLink="web"/>
理查德,下一次,您应该在布局 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>
同时管理 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);
通过使用 linkify:
Linkify 获取一段文本和一个正则表达式,并将文本中的所有正则表达式匹配转换为可点击的链接:
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText("http://example.com");
Linkify.addLinks(textView, Linkify.WEB_URLS);
不要忘记
import android.widget.TextView;
这是一个非常单行的 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);
我注意到这样使用 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"/>
它就像一个魅力。
接受的答案是正确的,但是这意味着电话号码、地图、电子邮件地址和常规链接(例如,没有 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"
;默认情况下是真的。
myapp://
方案(用于深度链接)。
text.length()
”附近。是吗?
在格式正确的 HTML
链接(例如 <a href="http://www.google.com/">Google</a>
)上使用 setMovementMethod(LinkMovementMethod.getInstance())
和 Html.fromHTML()
时,请务必不使用 setAutoLinkMask(Linkify.ALL)
。
你只需要这个:
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" />
用这个...
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 中可点击和可见链接的方法(通过代码)
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>"));
}
使用以下代码:
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));
[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.
}
我不得不在几个地方寻找这个,但我终于让这个版本的代码工作了。
文件strings.xml:
<string name="name1"><a href="http://www.google.com">link text1</a></string>
<string name="name2"><a href="http://www.google.com">link text2</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。
将 CDATA 添加到您的字符串资源
字符串.xml
<string name="txtCredits"><![CDATA[<a href=\"http://www.google.com\">Google</a>]]></string>
您遇到问题的原因是它仅尝试匹配“裸”地址。诸如“www.google.com”或“http://www.google.com”之类的东西。
通过 Html.fromHtml() 运行您的文本应该可以解决问题。您必须以编程方式执行此操作,但它有效。
如果使用基于 XML 的 TextView,根据您的要求,您只需做两件事:
在字符串中标识您的链接,例如“这是我的网页”。您可以将其添加到 XML 内容或代码中。在具有 TextView 的 XML 内容中,添加以下内容: android:linksClickable="true" android:autoLink="web"
我只是浪费了很多时间来弄清楚你必须使用 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>
在你的编辑文本中添加这个:
android:autoLink="web"
android:linksClickable="true"
在 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