如何使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是一个string资源,其中包含<a href="some site">Link text</a> @string/txtCredits <a href="some site">Link text</a>

Android突出显示TextView中的链接,但它们不响应点击。 有人能告诉我我做错了什么吗? 我是否需要为我的活动中的TextView设置一个onClickListener,以获得像这样简单的事情?

看起来像它与我定义我的string资源的方式。 这不起作用:

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

但是这样做:

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

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

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

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

 <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" ,它工作正常。 点击链接将打开浏览器并显示正确的页面。

我能猜到的一件事是其他一些观点是在链接之上。 透明的东西填充整个父母,但不显示链接上方的任何东西。 在这种情况下,点击进入这个视图,而不是链接。

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

  • 如果你的HTML中有完整的链接, android:autoLink="web"可以工作。 以下内容将以蓝色和可点击的forms突出显示:
  • 部分文字<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" ,如果你希望所有的链接都是可点击的。

上面的解决scheme并不适用于我,但是下面的解决scheme(似乎有点干净)。
首先,在string资源中,使用HTML实体编码定义您的标签打开V形符号,即:

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

并不是:

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

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

然后(如这里所build议的)在你的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))); 

就是这样,不需要正则expression式或其他手动入侵。

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

  • 添加一个类似HTML的资源string:

      <string name="link"><a href="https://www.google.pl/">Google</a></string> 
  • 添加您的视图到布局没有任何链接特定的configuration:

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

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

而已! 是的,有像“自动链接”和“linksClickable”选项只显式链接(不包含到html标签)是非常误导我也…

我用这个简单

 Linkify.addLinks(TextView, Linkify.ALL); 

使链接点击这里给出

我将这行添加到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> 

只有你需要在XML文本视图中添加这个

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

我希望这会帮助你;

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

理查德,下次你应该在布局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()); )以使链接可点击。

另外,事实如下:只要你设置了autoLinklinksClickable ,不要忘了在String.xml文件中添加这个,这样可以点击链接。

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

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

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

别忘了

 import android.widget.TextView; 

我注意到,因此使用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"/> 

它像一个魅力工作。

这是非常一行android代码,使电话和url可以从textView中select,不pipe是什么string和数据。 你不需要使用任何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); 

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

你只需要这个:

 android:autoLink="web" 

将此行插入到TextView中,可以通过引用网页来进行点击。 设置为此TextView文本的URL地址。

例:

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

接受的答案是正确的,但这将意味着电话号码,地图,电子邮件地址和常规链接,如http://google.com没有HREF标签将不会被点击,因为你不能在XML自动链接。

唯一完整的解决scheme,有一切点击,我发现是以下几点:

 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" ; 这是默认的。

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

用这个…

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

最简单的事情就是使用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); 

它会自动检测文本视图中的文本的url。

你有这个问题的原因是,它只是试图匹配“裸”的地址。 像“www.google.com”或“ http://www.google.com ”。

通过Html.fromHtml()运行您的文本应该做的伎俩。 你必须以编程方式做,但它的工作。

使用下面的代码:

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

自动链接手机不适合我。 下面的工作就像一个魅力,

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

将CDATA添加到您的string资源

strings.xml中

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

不知道是否值得添加另一个答案,但以防万一…

我不得不在几个地方打猎,但终于得到了这个版本的代码工作。

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

这将创build两个可点击的超链接文本link text1link text2redirect用户谷歌。

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

  1. 确定您的链接中的string,如“这是我的网页”。 您可以将其添加到xml或代码中。

  2. 在具有TextView的xml中,添加这些:

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

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

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

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

这对我来说是有效的。 祝你好运。

只是浪费了太多的时间来找出你必须使用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示例

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

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

string.xml

 <string name="applink">Looking for the regular Zesteve App? <a href="https://play.google.com/store/apps/details?id=zesteve.com.myapplication">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"/> 

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

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

现在,您不需要使用此方法设置android:autoLink="web"android:linksClickable="true"

我希望你会觉得这有帮助。

由于数据绑定出来,我想分享我的解决scheme数据绑定TextViews支持HTML标签与可点击的链接。

为了避免检索每个From.html并使用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); } @Override public void setText(CharSequence text, BufferType type) { super.setText(Html.fromHtml(text.toString()), type); this.setMovementMethod(LinkMovementMethod.getInstance()); } } 

我做了一个也显示使用这个实例和视图的要点 。

我的代码是这样的:

 <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(预览)中testing