带有SDK 20+的手机认为,在它们之间有一个点的任何两个单词都是一个链接。我怎么做我自己的链接探测器?
android:autoLink="web"认为abra.kadabra是一个url。
setAutoLinkMask(Linkify.WEB_URLS);认为abra.kadabra是一个url。
带有SDK < 20的手机可以正确链接所有的东西,只有当SDK是20+时才会发生错误。
我尝试过的例子:
代码发生在我的自定义TextView中
SpannableString ss = new SpannableString(this.getText().toString());
//LinkManager is a copy of Linkify but with another pattern.
LinkManager.addLinks(ss, LinkManager.WEB_URLS);
setText(ss);
setMovementMethod(LinkMovementMethod.getInstance());
setWebLinksTouchFeedback();这没有联系到任何东西。即使我使用Linkify而不是LinkManager
我尝试过许多其他的解决方案,所有这些最终都是把任何东西或一切联系起来。有什么解决办法吗?
发布于 2015-05-29 21:16:02
您可以使用Matcher和Pattern类制作您自己的链接检测器,并使用ClickableSpan使它们可点击。
String text = textView.getText().toString();
int i=0;
SpannableString spannableString = new SpannableString(text);
Matcher urlMatcher = Patterns.WEB_URL.matcher(text);
while(urlMatcher.find()) {
String url = urlMatcher.group(i);
int start = urlMatcher.start(i);
int end = urlMatcher.end(i++);
spannableString.setSpan(new GoToURLSpan(url), start, end, 0);
}
textView.setText(spannableString);
textView.setMovementMethod(new LinkMovementMethod()); private static class GoToURLSpan extends ClickableSpan {
String url;
public GoToURLSpan(String url){
this.url = url;
}
public void onClick(View view) {
Uri webPage = Uri.parse(url); //http:<URL> or https:<URL>
Intent intent = new Intent(Intent.ACTION_VIEW, webPage);
view.getContext().startActivity(intent);
}
}<TextView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/text"
android:text="Link http://google.com but dont link abra.kadabra"
android:textColorLink="@color/accent"
android:textColorHighlight="@color/accent" />将Pattern.WEB_URL替换为您自己的。您可以在StackOverflow中找到一些url模式。
发布于 2015-06-02 13:35:10
我自己修正了这个方法,在setText的超级方法之前调用这个方法,因为我想链接的所有文本都是动态设置的。
private void linkifyTexts(CharSequence charsequence)
{
String text = charsequence.toString();
String[] parts = text.split("\\s+");
for (int i = 0; i < parts.length; i++)
{
boolean isUrl = isURLValid(parts[i]);
if (isUrl)
{
setAutoLinkMask(Linkify.WEB_URLS | Linkify.EMAIL_ADDRESSES);
setWebLinksTouchFeedback();
break;
}
}
}
public boolean isURLValid(String url)
{
Pattern p = Pattern.compile(getContext().getString(R.string.url_pattern));
return p.matcher(url).matches();
}具有我想接受的urls的自定义模式。谢谢你的帮助,我很感激。
https://stackoverflow.com/questions/30528825
复制相似问题