SDK 20+的手机认为任何两个带有点之间的单词都是链接。如何制作自己的Link探测器?
android:autoLink="web"
认为abra.kadabra
是个网址。
setAutoLinkMask(Linkify.WEB_URLS);
认为abra.kadabra
是个网址。
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
我尝试了许多其他解决方案,所有这些解决方案最终都无法连接任何内容。那里有解决方案吗?
答案 0 :(得分:3)
您可以使用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
替换为您自己的<div>
。您可以在StackOverflow中找到一些网址模式。
答案 1 :(得分:0)
我通过在setText的super方法之前调用此方法来自行修复它,因为我想要链接的所有文本都是动态设置的。
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();
}
我想接受的网址自定义模式。感谢您的帮助,我很感激。