如何使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形符号,即:
<a href="http://www.google.com">Google</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);
使链接点击这里给出
我将这行添加到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>
只有你需要在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());
)以使链接可点击。
另外,事实如下:只要你设置了autoLink和linksClickable ,不要忘了在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"><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());
这将创build两个可点击的超链接文本link text1
和link text2
redirect用户谷歌。
如果使用基于XML的TextView,为了您的要求,您只需要做两件事:
-
确定您的链接中的string,如“这是我的网页”。 您可以将其添加到xml或代码中。
-
在具有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